为什么Scala需要def语句?

时间:2014-10-14 20:32:42

标签: javascript scala immutability

我是scala的新手,但我有javascript的背景。

虽然我认为需要将valvar(可变且不可变)分开,但我无法理解为什么需要def语句。

如果函数是真正的一等公民,就像在javascript中一样,为什么要用def而不是val声明它们?

该设计决策是基于JVM相关的约束,还是有一些我无法理解的基础逻辑?

3 个答案:

答案 0 :(得分:9)

功能的一个很大的局限是它们不能作为值通用。 E.g。

def foo[A](bar: A): Unit

不能表示为函数值

val foo: A => Unit  // A is _not_ a type parameter

需要类型参数A的解析。其他差异是:方法带有this作为封闭类的自然概念;他们可以通过return中止。它们可以有多个参数列表,最重要的是隐式参数列表。他们有命名和默认参数。 (我试图想象一个带有命名和默认参数的函数看起来如何,也许它可以被设计)

只有函数值可能不可能,但def似乎更适合Scala的OO方面。

答案 1 :(得分:4)

defvalvar的不同之处在于,每次引用变量时,都会重新评估其表达式。

答案 2 :(得分:1)

我认为这是为了更轻松地从Java迁移而做出的语言决策。将功能视为功能值,这是一个很大的转变。