e.g。
val f1 = (a:Int) => a+1
def f2 = (a:Int) => a+1
似乎它们是可以互换的,是否有任何具体的用例我应该使用特定的用例?
答案 0 :(得分: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
表示一个方法,所以它不希望像这样使用;它总是希望跟随论证。您可以随后通过下划线将方法转换为函数,但如果没有必要,这可能看起来有点难看。