【发布时间】:2010-09-05 16:14:36
【问题描述】:
给定三种表达相同功能的方式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>
【问题讨论】:
-
您应该注意,在上面的第二块中,在 REPL 中计算
f1显示静态绑定到f1的值,同时计算f2和f3显示 的结果调用这些方法。特别是,每次调用f2或f3时都会生成一个新的Function1[Int, Int]实例,而f1永远是相同的Function1[Int, Int]。 -
@RandallSchulz 鉴于 val 版本不需要新的函数实例,为什么要在这种情况下使用 def?
-
@virtualeyes 我能回忆起的唯一情况是在组合解析器库中看到 defs 产生 FunctionN[...] 值。编写产生函数的方法并不常见,而且几乎永远不会使用 def 产生语义/功能不变函数的多个副本。
标签: scala