0

我有以下正在运行并打印“foreach 已执行”的代码:

val buf = ArrayBuffer[() => Unit]()
def add(o: () => Unit) = buf += o
add(() => print("executed "))
print("foreach ")
buf foreach (_())

我想简化第 3 行,但它在第一行中断:

val buf = ArrayBuffer[=> Unit]()
def add(o: => Unit) = buf += o
add { print("executed ") }
print("foreach ")
buf foreach (_)

有没有办法做到这一点?

4

2 回答 2

2

您不能将按名称值 ( =>T) 用作可分配对象,只能用作方法的参数。这意味着你不能参数化你ArrayBuffer=>Unit. 您ArrayBuffer将必须使用 参数化() => Unit

要将名称值“提升”为函数值,您必须使用() => ...语法。您可以执行以下操作:

val buf = ArrayBuffer[() => Unit]()
def add(o: => Unit) = buf += () => o
add { print("executed ") }
print("foreach ")
buf foreach (_())
于 2013-03-16T11:54:15.083 回答
1

如果我对您的理解正确,您想存储代码片段并稍后对其进行评估。该: => Type语法用于按名称传递参数,这意味着每次引用它时都会对其进行评估(而不是在将其传递给函数之前)。据我所知,推迟评估的唯一方法是围绕它创建某种包装器,并通过方法调用使评估可用。在您的情况下,一个简单的非参数函数将是一个很好的包装器:

val buf = ArrayBuffer[() => Unit]()
def add(o: => Unit) = buf += {() => o }
add(() => print("executed "))
print("foreach ")
buf foreach (_())
于 2013-03-16T11:54:05.630 回答