[英]Function Literal referencing by val and def
我试图理解这两种引用/定义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
?
好的..我的问题是: 第1和第2种方法的优点和缺点是什么?
它由def
定义,它仍然是Function Literal
吗?
首先,你的例子都不是实际的函数文字 - 你以简单的无糖方式创建一个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
和B
任何实例都必须是具体类型)。 但是我们可以定义一个返回函数的多态方法,当我们编写例如myIndentity(1)
, A
将被推断为Int
,我们将创建(并应用)一个Function[Int, Int]
就像你一样我期待。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.