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