提供以下方案:
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
有没有办法让它与下划线一起使用?
答案 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
来缓存它。