我是scala的新手,但我有javascript的背景。
虽然我认为需要将val
和var
(可变且不可变)分开,但我无法理解为什么需要def
语句。
如果函数是真正的一等公民,就像在javascript中一样,为什么要用def
而不是val
声明它们?
该设计决策是基于JVM相关的约束,还是有一些我无法理解的基础逻辑?
答案 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)
def
与val
和var
的不同之处在于,每次引用变量时,都会重新评估其表达式。
答案 2 :(得分:1)
我认为这是为了更轻松地从Java迁移而做出的语言决策。将功能视为功能值,这是一个很大的转变。