ScalaVar,Val和Def

示例

变种

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