Avar是参考变量,类似于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是由编译器根据第一个值分配得出的。
Aval是常数参考。因此,无法将新对象分配给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)
Adef定义了一种方法。无法将方法重新分配给该方法。
scala> def z = 1 z: Int scala> z = 2 <console>:12: error: value z_= is not a member of object $iw z = 2 ^
在上面的示例中,val y并def z返回相同的值。然而,一个def被评价时,它被称为,而val或var评价时,它被分配。当定义具有副作用时,这可能导致不同的行为:
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