繁体   English   中英

Val和def的函数文字引用

[英]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

它在使用方面似乎几乎相同。 我要么将v2f2传递给接受(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]AB任何实例都必须是具体类型)。 但是我们可以定义一个返回函数的多态方法,当我们编写例如myIndentity(1)A将被推断为Int ,我们将创建(并应用)一个Function[Int, Int]就像你一样我期待。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM