我有以下代码正在工作并打印“foreach execution”:
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 (_)
有办法吗?
答案 0 :(得分:2)
您不能使用名称值(=>T
)作为可分配对象,仅作为方法的参数。
这意味着您无法使用ArrayBuffer
对=>Unit
进行参数化。您的ArrayBuffer
必须使用() => Unit
进行参数化。
要将名称值“提升”为函数值,必须使用() => ...
语法。
您可以执行以下操作:
val buf = ArrayBuffer[() => Unit]()
def add(o: => Unit) = buf += () => o
add { print("executed ") }
print("foreach ")
buf foreach (_())
答案 1 :(得分:1)
如果我理解正确,您希望存储代码片段并在以后对其进行评估。 : => Type
语法用于按名称传递参数,这意味着每次引用时都会对其进行求值(而不是在将其传递给函数之前)。据我所知,推迟评估的唯一方法是创建一些包装器,并通过方法调用使评估可用。在您的情况下,一个简单的非参数函数将是一个很好的包装器:
val buf = ArrayBuffer[() => Unit]()
def add(o: => Unit) = buf += {() => o }
add(() => print("executed "))
print("foreach ")
buf foreach (_())