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 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
/ def
s。其他所有工作方式與上述相同:
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