给出所有参数时如何不应用函数

时间:2014-09-17 13:13:45

标签: scala

提供以下方案:

def add(a: Int, b: Int): Int = a + b
def f1(adder: () => Int) = adder()

f1(add(1,2) _) // Does **NOT** compile, because add seems to be already executed
f1(() => add(1,2)) // This works, but seems to be ugly

有没有办法让它与下划线一起使用?

1 个答案:

答案 0 :(得分:5)

通过使用by-name参数,您可以在没有下划线的情况下使其工作:

scala> def f2(adder: => Int) = adder
f2: (adder: => Int)Int

scala> f2(add(1,2))
res0: Int = 3

第3行的问题是f1 需要一个用空参数调用的函数。通过名称参数,您可以传入任何导致给定类型的任意表达式,并且在您在方法体内使用它之前不会对其进行求值。如果您想在方法正文中的多个位置使用by-name参数,但又不想重新评估它,则可以通过将其分配给lazy val来缓存它。