gpt4 book ai didi

scala - 这两种声明函数的方式有什么区别?

转载 作者:行者123 更新时间:2023-12-04 17:53:15 24 4
gpt4 key购买 nike

遵循两个相似的函数,ab , 声明不同:

scala> val a = { x:Int => x+x }
a: Int => Int = <function1>

scala> def b(x:Int) = x+x
b: (x: Int)Int

我能找到两者之间的唯一区别是只有 def函数我可以在传递参数时指定参数的名称(例如 b(x=1) )。这些功能在其他方面有何不同?应该在什么时候使用?

编辑:

我也无法使用 @tailrec带有 val 的注释方法。

最佳答案

主要区别在于 Scala 如何翻译这些定义。在 Scala 中,lambda(匿名函数、函数值、函数字面量)和方法是不同的东西。你的第一个定义是一个 Function1 实例的糖。 class,它是用于 lambdas 的类之一,第二个只是周围对象的一个​​方法,它编译为标准的 Java 方法。

两者之间的实际区别在于 Scala 不能让您将方法称为值,这使其成为二等公民。在处理高阶函数时,这会导致冗余间接。例如,以下内容:

1.to(4).map(b)

脱糖到包装器 lambda 中:
1.to(4).map((x: Int) => b(x))

这本身就是一种糖:
1.to(4).map(
new Function1[Int, Int] {
def apply(x: Int): Int = b(x)
}
)

感觉很多余,对吧?这就是为什么如果您对该函数的意图是将其用作一等公民(即作为值传递),则从一开始就将其声明为 lambda 更为合理。

关于scala - 这两种声明函数的方式有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23978941/

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