gpt4 book ai didi

scala - val 和 def 引用的函数文字

转载 作者:行者123 更新时间:2023-12-01 23:59:32 24 4
gpt4 key购买 nike

我试图理解这两种引用/定义Function Literal(引用匿名函数)的方法之间的关键区别:

通过 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

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

而且它是由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] 完全符合您的预期。

关于scala - val 和 def 引用的函数文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22137357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com