= 賦值運算 scala的賦值運算和java的有著很大的不同。如a=b這樣的賦值運算,在Java中返回值是a的值,在scala中返回的則是Unit。Unit是值類型,全局只存在唯一的值,即(),通常Unit只用來聲明函數或方法的返回值,其他場景基本是沒有意義的。這樣就很容易導致一些錯誤地使用,比如a... ...
= 賦值運算
scala的賦值運算和java的有著很大的不同。如a=b這樣的賦值運算,在Java中返回值是a的值,在scala中返回的則是Unit。Unit是值類型,全局只存在唯一的值,即(),通常Unit只用來聲明函數或方法的返回值,其他場景基本是沒有意義的。這樣就很容易導致一些錯誤地使用,比如a=b=c這樣的賦值運算在java中是絕對可以的,但是在scala中運行就會報錯。看一段代碼:
var a, b, c = 1 a = b=c println(a)
上面這段代碼還沒有執行就在IDE中報錯了,勉強執行下看看會報什麼錯:
報了類型不匹配的錯誤,因為在第一行代碼中scala推斷a是一個Int型的變數,後又將b=c的運算結果——一個Unit值——賦值給它,那當然會報錯了。
即使只在scala中看賦值運算符“=”號也是一個比較奇怪的東西:它不是一個方法,在預設情況下不可以這樣使用——a.=(1)。對於這一點暫時無法深入探究,以後有時間慢慢再看。
==運算
在java中,對於基本類型和引用類型的==運算有著不同的計算方式:
- 對於基本類型來說,==運算比較的就是兩邊表達式的值;
- 對於引用類型來說,==運算比較的是兩邊對象的引用而非是對象的值;在Java中比較對象的值使用的是equals方法。
在scala中沒有對象,那麼不論類型如何,==的運算都是面向值的。這一點由scala的Any類(scala中所有的類都是由它派生而來)提供了保證:它將==()方法實現為final的方法。因此在scala中進行值的比較就可以簡單使用==運算,如果還有一些特殊化的比較,就需要改寫equals方法了。如果想執行對於引用的比較可以使用eq()方法。看一下下麵這段程式:
val str1 = "hello" val str2 = "hello" val str3 = new String("hello") println(str1 == str2) // Equivalent to Java's str1.equals(str2) println(str1 eq str2) // Equivalent to Java's str1 == str2 println(str1 == str3) println(str1 eq str3)
程式的執行結果:
結果很清楚了。
---------------------------------------------------
今天學了scala的=和==,這兩個運算和Java中對應符號的運算有著明顯的不同,以後需要註意下。
#########