第五章 基本類型和操作
5.1 基本類型
注意:在scala中基本類型小寫或者大寫都是一個意思,例如int和Int,最後都轉化爲Scala.Int。後續可能不支持小寫,推薦使用大寫開頭。Scala編譯器能直接把Scala值類型在它產生的字節碼裏轉義成Java的原始類型。
5.3 操作符與方法
前面提到過,1 + 2與(1).+(2)其實是一回事。換句話說,就是Int類包含了叫做+的方法,它帶一個Int參數並返回一個Int結果。另外,Int包含了許多帶不同的參數類型的重載:overload的+方法。例如,Int還有另一個也叫+的方法參數和返回類型爲Long。如果你把Long加到Int上,這個替換的+方法就將被調用。
操作符標註不僅限於像+這種其他語言裏看上去像操作符一樣的東西,其實任何方法都當作操作符來標註。
查看如下代碼:
scala> val s = "Hello, world!"
s: java.lang.String = Hello, world!
scala> s indexOf 'o' // Scala調用了s.indexOf(’o’)
res0: Int = 4
scala> s indexOf ('o', 5) // Scala調用了s.indexOf(’o’, 5)
res1: Int = 7
除了中綴操作符還有前綴(如“+”,“-”,“!”,“~”)和後綴操作符(如“toLong”)。前綴實際上調用了“unary_”。例如-2.0實際上調用了”(2.0).unary_-“。
後綴操作符是不用點或括號調用的不帶任何參數的方法。Scala裏,你可以捨棄方法調用的空括號。例外就是如果方法帶有副作用就加上括號,如println(),不過如果方法沒有副作用就可以去掉括號,如String上調用的toLowerCase。
所謂”副作用”(side effect),指的是函數內部與外部互動(最典型的情況,就是修改全局變量的值),產生運算以外的其他結果。
5.7 對象對等性
scala中的“==”除了可以作用於基本類型,也可以作用於所有對象。“==”兩端的可以是相同類型,也可以是不同類型,甚至可以比較null或者任何可能爲null的東西,而不會拋出異常。
scala中的“==”比較過程是:先判斷左邊是否爲null,如果不是則調用equals方法。equals方法的精度取決於“==”左邊的參數。Scala中不同類型判斷“==”可能會得到true的結果。比如“1.0 == 1”的結果爲true;“(“he”+”llo”)==”hello”結果爲true。因爲在有些類型裏重寫了equals方法,使得比較的是它們的內容而不是引用的對象。
5.8 操作符的優先級和關聯性
Scala基於操作符格式裏方法的第一個字符決定優先級。
但有一個例外:如果操作符以等號字符(=)結束,且操作符並非比較操作符<=,>=,==,或=,那麼這個操作符的優先級與賦值符(=)相同。也就是說,它比任何其他操作符的優先級都低(如:“*=”,“+=”)
5.9 富包裝器
scala中每個基本類型都有一個富包裝器,如下所示。富包裝器中提供了更豐富的方法。調用這些方法可以通過隱式轉換實現。