给出了三种表达相同功能的方式f(a) := a + 1
:
val f1 = (a:Int) => a + 1
def f2 = (a:Int) => a + 1
def f3:(Int => Int) = a => a + 1
这些定义有何不同?REPL没有显示任何明显的差异:
scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>
@RandallSchulz给出val版本不需要新的函数实例,为什么在这种情况下会使用def?
—
virtualeyes 2012年
@virtualeyes我唯一记得的情况就是组合器解析器库中看到defs产生FunctionN [...]值的情况。编写产生函数的方法不是很常见,并且几乎从不使用def来产生语义/功能不变的函数的许多副本。
—
Randall Schulz 2012年
f1
中,REPL中的f1
评估显示了评估时静态绑定到的值,f2
并f3
显示了调用这些方法的结果。特别地,一个新的Function1[Int, Int]
实例产生每当任一f2
或f3
调用,而f1
是相同的Function1[Int, Int]
永远。