Scala 基本數(shù)據(jù)類型的實(shí)現(xiàn)方法

2018-08-12 21:25 更新

Scala 基本數(shù)據(jù)類型的實(shí)現(xiàn)方法

Scala 的基本數(shù)據(jù)類型是如何實(shí)現(xiàn)的?實(shí)際上,Scala 以與 Java 同樣的方式存儲整數(shù):把它當(dāng)作 32 位的字類型。這對于有效使用 JVM 平臺和與 Java 庫的互操作性方面來說都很重要。標(biāo)準(zhǔn)的操作如加法或乘法都被實(shí)現(xiàn)為數(shù)據(jù)類型基本運(yùn)算操作。然而,當(dāng)整數(shù)需要被當(dāng)作(Java)對象看待的時(shí)候,Scala 使用了“備份”類 java.lang.Integer。如在整數(shù)上調(diào)用 toString 方法或者把整數(shù)賦值給 Any 類型的變量時(shí),就會這么做,需要的時(shí)候,Int 類型的整數(shù)能自動轉(zhuǎn)換為 java.lang.Integer 類型的“裝箱整數(shù)(boxed integer)”。

這些聽上去和 Java 的 box 操作很像,實(shí)際上它們也很像,但這里有一個(gè)重要的差異,Scala 使用 box 操作比在 Java 中要少的多:

// Java代碼 
boolean isEqual(int x,int y) { 
  return x == y; 
} 
System.out.println(isEqual(421,421));

你當(dāng)然會得到 true。現(xiàn)在,把 isEqual 的參數(shù)類型變?yōu)閖 ava.lang.Integer(或 Object,結(jié)果都一樣):

// Java代碼 
boolean isEqual(Integer x, Integery) { 
  return x == y; 
} 
System.out.println(isEqual(421,421));

你會發(fā)現(xiàn)你得到了 false!原因是數(shù) 421 使用”box”操作了兩次,由此參數(shù) x 和 y 是兩個(gè)不同的對象,因?yàn)樵谝妙愋蜕?=表示引用相等,而 Intege r是引用類型,所以結(jié)果是 false。這是展示了 Java 不是純面向?qū)ο笳Z言的一個(gè)方面。我們能清楚觀察到基本數(shù)據(jù)值類型和引用類型之間的差別。

現(xiàn)在在 Scala 里嘗試同樣的實(shí)驗(yàn):

scala> def isEqual(x:Int,y:Int) = x == y
isEqual: (x: Int, y: Int)Boolean
scala> isEqual(421,421)
res0: Boolean = true
scala> def isEqual(x:Any,y:Any) = x == y
isEqual: (x: Any, y: Any)Boolean
scala> isEqual(421,421)
res1: Boolean = true

Scala 的 == 設(shè)計(jì)出自動適應(yīng)變量類型的操作,對值類型來說,就是自然的(數(shù)學(xué)或布爾)相等。對于引用類型,==被視為繼承自 Objec t的 equals 方法的別名。比如對于字符串比較:

scala> val x = "abcd".substring(2)
x: String = cd
scala> val y = "abcd".substring(2)
y: String = cd
scala> x==y
res0: Boolean = true

而在 Java 里,x 與 y 的比較結(jié)果將是 false。程序員在這種情況應(yīng)該用 equals,不過它容易被忘記。

然而,有些情況你需要使用引用相等代替用戶定義的相等。例如,某些時(shí)候效率是首要因素,你想要把某些類哈希合并: hash cons 然后通過引用相等比較它們的實(shí)例,為這種情況,類 AnyRef 定義了附加的 eq 方法,它不能被重載并且實(shí)現(xiàn)為引用相等(也就是說,它表現(xiàn)得就像 Java 里對于引用類型的==那樣)。同樣也有一個(gè) eq 的反義詞,被稱為 ne。例如:

scala> val x =new String("abc")
x: String = abc
scala> val y = new String("abc")
y: String = abc
scala> x == y
res0: Boolean = true
scala> x eq y
res1: Boolean = false
scala> x ne y
res2: Boolean = true
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號