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

reg*_*exp 2 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
Run Code Online (Sandbox Code Playgroud)

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

acj*_*jay 5

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

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

scala> f2(add(1,2))
res0: Int = 3
Run Code Online (Sandbox Code Playgroud)

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