Val和def的函数文字引用

时间:2014-03-03 01:48:16

标签: scala function-literal

我正在尝试理解这两种引用/定义Function Literal(引用anonymous function)方法之间的重要区别:

val

scala> val v2 = new Function[Int, Int] {
     | def apply(a: Int): Int = a + 1
     | }
v2: Int => Int = <function1>

def

scala> def f2 = new Function[Int, Int] {
     | def apply(a: Int): Int = a + 1
     | }
f2: Int => Int

在使用方面似乎几乎相同。我可以将v2f2传递给接受(Int) => Int作为参数的函数。将参数传递给它..

我想或者v2的情况是它创建了一个引用Function1对象的Function1对象..就像proxy一样?

好的..我的问题是:第1和第2种方法的优点和缺点是什么?

它由def定义,是否仍为Function Literal

1 个答案:

答案 0 :(得分:3)

首先,你的两个例子都不是函数文字 - 你是用普通的无糖方式创建一个Function实例,事实上你可以用它方法(new Function { ... })从Java代码创建scala.Function的实例。

以下是两个函数文字,并且与您的定义完全等效:

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

唯一真正的区别在于val将一劳永逸地创建一个实例,无论您使用v2多少次(即使您从未使用过它), def每次都会创建一个新实例(如果你从未使用它,则根本不创建)。因此,您通常希望使用val

但是,有些情况下您需要使用def。请考虑以下事项:

def myIdentity[A] = (a: A) => a

我们无法将其写为val,因为Scala在这个意义上没有多态函数(对于Function[A, B]A和{{1}的任何实例必须是具体的类型)。但是我们可以定义一个返回函数的多态方法,当我们写例如BmyIndentity(1)将被推断为A,我们将完全按照您的预期创建(并应用)Int