具有代码块返回单元的泛型

时间:2013-03-16 10:21:53

标签: scala generics

我有以下代码正在工作并打印“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 (_)

有办法吗?

2 个答案:

答案 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 (_())