TOP

scala學習手記9 - =和==
2017-10-10 12:12:13 】 瀏覽:9247
Tags:

= 賦值運算

scala的賦值運算和java的有著很大的不同。如a=b這樣的賦值運算,在Java中返回值是a的值,在scala中返回的則是Unit(Unit是值類型优乐棋牌app下载,全局只存在唯一的值,即(),通常Unit只用來聲明函數或方法的返回值,其他場景基本是沒有意義的)。這樣就很容易導致一些錯誤地使用,比如a=b=c這樣的賦值運算在java中是絕對可以的,但是在scala中運行就會報錯。看一段代碼:

var a, b, c = 1
a =  b=c
println(a)

上面這段代碼還沒有執行就在IDE中提示錯誤了,勉強執行下看看會報什么錯:

image

報了類型不匹配的錯誤,因為在第一行代碼中scala推斷a是一個Int型的變量,后又將b=c的運算結果——一個Unit值——賦值給它,那當然會報錯了。

即使只在scala中看賦值運算符“=”號也是一個比較奇怪的東西:它不是一個方法,在默認情況下不可以這樣使用——a.=(1)。對于這一點暫時無法深入探究,以后有時間慢慢再看。

==運算

在java中,基本類型和引用類型對==運算有著不同的計算方式:

  • 對于基本類型來說,==運算比較的就是兩邊表達式的值;
  • 對于引用類型來說,==運算比較的是兩邊對象的引用而非是對象的值;在Java中比較對象的值使用的是equals方法。

在scala中沒有對象,不論類型如何,==運算都是面向值的。這一點由scala的Any類(scala中所有的類都是由它派生而來)提供了保證:它將==()方法實現為final的方法。因此在scala中進行值的比較就可以簡單使用==運算,如果還有一些特殊化的比較,就需要改寫equals方法了。在scala中如果想執行對于引用的比較可以使用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)

程序的執行結果:

image

結果很清楚了。

---------------------------------------------------

今天學了scala的=和==,這兩個運算和Java中對應符號的運算有著明顯的不同优乐棋牌app下载优乐棋牌app下载,以后需要注意下。

#########

請關注公眾號獲取更多資料



】【打印繁體】【】【】 【】【】【】 【關閉】 【返回頂部
上一篇scala學習手記8 - 自適應的默認做.. 下一篇scala學習手記10 - 訪問修飾符