2013-03-16 43 views
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 (_) 

有没有办法做到这一点?

回答

1

如果我理解你正确,你想存储代码段并在以后评估它们。 : => Type语法用于按名称传递参数,这意味着每次参考时都会评估它(而不是在将它传递给函数之前)。据我所知,推迟评估的唯一方法是创建一些包装,并通过方法调用使评估可用。在你的情况下,简单的无参数的功能将是一个精细的包装:

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

*更正:*按名称参数是_不_懒惰!它们不是在“首次需要时”评估的,它们会在被调用的方法中每次被引用_(动态,而不是静态)评估。 – 2013-03-16 16:38:39

+0

谢谢,我编辑了我的答案 – EECOLOR 2013-03-16 18:14:48

2

您无法通过名称值(=>T)作为分配对象使用,只作为方法的参数。 这意味着您无法通过=>Unit参数化您的ArrayBuffer。您的ArrayBuffer必须使用() => Unit进行参数化。

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

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