3

例如

val f1 = (a:Int) => a+1
def f2 = (a:Int) => a+1

似乎它们是可以互换的,是否有任何特定的用例我应该使用特定的用例?

4

1 回答 1

4

通常将def版本写为:

def f2(a:Int) = a+1

如果你按照他们的方式编写它,它实际上是在创建一个方法f2,当被调用时,它会构造一个新的函数闭包。所以在你的两种情况下,你仍然有一个功能。但是在第一种情况下,该函数只被构造一次并存储(作为f1)以供以后使用。但是在第二种情况下,每次f2引用都会构造函数,这有点浪费。

那么什么时候更喜欢函数而不是方法呢?好吧,在某些情况下,您可以更轻松地使用函数。考虑这种情况:

(1 to 3).map(f1 andThen f1)    // totally fine
(1 to 3).map(f2 andThen f1)    // "missing arguments" error
(1 to 3).map(f2 _ andThen f1)  // fixed by adding "_" after the method name

所以f1总是一个函数,所以你可以调用一个类似的方法andThen。变量f2代表一个方法,所以不希望这样使用;它总是期望后面跟着参数。您总是可以通过在方法后面加上下划线将其转换为函数,但如果没有必要,这可能看起来有点难看。

于 2012-09-21T04:27:03.070 回答