我是 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/