function - def f(x : Int) = x+1 and val f = (x: Int) => x+1 in Scala 之间的实际区别

标签 function scala syntax definition

我是 Scala 新手,我在理解这一点时遇到问题。为什么同一个概念有两种语法,而且没有一个语法更高效或更短(仅从打字的角度来看,也许它们的行为不同 - 这就是我要问的)。

在 Go 中,类似物有一个实际的区别 - 你不能前向引用分配给变量的 lambda,但你可以从任何地方引用命名函数。如果我理解正确的话,Scala 会混合这两个:您可以前向引用任何变量(如果我错了,请纠正我)。

<小时/>

请注意,此问题与 What is the difference between “def” and “val” to define a function 不重复。 .

我知道 def 每次被引用/调用时都会对 = 之后的表达式求值,而 val 仅计算一次。但这是不同的,因为 val 定义中的表达式计算结果为函数。

<小时/>

它也不是 Functions vs methods in Scala 的重复项.

这个问题涉及Scala的语法,并不是直接问函数和方法之间的区别。尽管答案的内容可能相似,但在本网站上明确这一点仍然很有值(value)。

最佳答案

(据我所知)存在三个主要区别:

1。内部代表

函数表达式(又名匿名函数或 lambda)在生成的字节码中表示为任何 Function 特征的实例。这意味着函数表达式也是对象。另一方面,方法定义是 JVM 上的一等公民,并且具有特殊的字节码表示形式。如果不进行分析,很难判断这对性能有何影响。

2。引用语法

对函数和方法的引用具有不同的语法。当您想要将方法的引用作为参数发送到代码的其他部分时,您不能只说 foo 。你必须说foo _。对于函数,你只需说 foo ,事情就会按预期工作。语法 foo _ 有效地将对 foo 的调用包装在匿名函数内。

3。泛型支持

方法支持类型参数化,函数不支持。例如,无法使用函数值来表达以下内容:

def identity[A](a: A): A = a

最接近的是这个,但它丢失了类型信息:

val identity = (a: Any) => a

关于function - def f(x : Int) = x+1 and val f = (x: Int) => x+1 in Scala 之间的实际区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22354396/

相关文章:

php - 这如何成为有效的 php 语法

AFNetworking 的 iOS block 问题

scala - Spark Streaming groupByKey 和 updateStateByKey 实现

Powershell 函数意外地没有返回任何对象

在函数返回之间进行选择

function - 如何从 Rust 中的子文件夹导入函数

JavaScript:为什么有些函数不是方法?

c# - 使用 lambda 函数合并包含不同对象的列表

scala - 我如何最好地在 Akka Actor 之间分享行为?

scala - 使用 Scala 的数字和小数进行更高级的数学运算