Var Val 和 Def

VAR

var 是一个引用变量,类似于 Java 等语言中的变量。可以将不同的对象自由分配给 var,只要给定的对象具有与声明 var 相同的类型:

scala> var x = 1
x: Int = 1

scala> x = 2
x: Int = 2

scala> x = "foo bar"
<console>:12: error: type mismatch;
 found   : String("foo bar")
 required: Int
       x = "foo bar"
       ^

请注意,在上面的示例中,var 的类型是由编译器在给定第一个值赋值时推断出来的。

VAL

val 是一个恒定的参考。因此,不能将新对象分配给已经分配的 val

scala> val y = 1
y: Int = 1

scala> y = 2
<console>:12: error: reassignment to val
       y = 2
         ^

然而,val 指向的对象不是恒定的。该对象可能会被修改:

scala> val arr = new Array[Int](2)
arr: Array[Int] = Array(0, 0)

scala> arr(0) = 1

scala> arr
res1: Array[Int] = Array(1, 0)

高清

def 定义了一种方法。无法重新分配方法。

scala> def z = 1
z: Int

scala> z = 2
<console>:12: error: value z_= is not a member of object $iw
       z = 2
       ^

在上面的例子中,val ydef z 返回相同的值。然而,def 被评价时,它被称为valvar 进行评价时,当它被分配。当定义有副作用时,这可能导致不同的行为:

scala> val a = {println("Hi"); 1}
Hi
a: Int = 1

scala> def b = {println("Hi"); 1}
b: Int

scala> a + 1
res2: Int = 2

scala> b + 1
Hi
res3: Int = 2

功能

因为函数是值,所以可以将它们分配给 val / var / defs。其他所有工作方式与上述相同:

scala> val x = (x: Int) => s"value=$x"
x: Int => String = <function1>

scala> var y = (x: Int) => s"value=$x"
y: Int => String = <function1>

scala> def z = (x: Int) => s"value=$x"
z: Int => String

scala> x(1)
res0: String = value=1

scala> y(2)
res1: String = value=2

scala> z(3)
res2: String = value=3