3

我试图了解这两种引用/定义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

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

我猜还是 v2 的情况下它创建了一个Function1引用该对象的Function1对象.. 像proxy?

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

它是由 定义的def,它还在Function Literal吗?

4

1 回答 1

3

首先,您的两个示例实际上都不是函数字面量Function——您正在以普通的无糖方式创建一个实例,实际上您可以使用这种方法 ( new Function { ... })scala.Function从 Java 代码创建一个 的实例。

以下都是函数文字,与您的定义完全相同:

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

这里唯一真正的区别是,无论您使用多少次(即使您从未使用过),都会val一劳永逸地创建一个实例,而每次(或根本不)都会创建一个新实例,如果你从不使用它)。因此,您通常会想要使用.v2defval

但是,在某些情况下,您需要使用def. 考虑以下:

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

我们不可能把它写成 a val,因为 Scala 在这个意义上没有多态函数(对于 , 的任何实例Function[A, B]A并且B必须是具体类型)。但是我们可以定义一个返回函数的多态方法,当我们编写 eg 时myIndentity(1)A将推断为 be Int,并且我们将Function[Int, Int]完全按照您的期望创建(并应用)a。

于 2014-03-03T02:34:54.693 回答