2012-01-07 20 views
20

斯卡拉教程困惑說Int的添加操作實際上是一個方法調用:1+1意味着1.+(1)通過Int的操作定義在斯卡拉

但是,當我看着的Int.scala的源代碼,它看來,方法將只是打印一條錯誤消息。任何人都可以向我解釋這是如何工作的?

def +(x: Int): Int = sys.error("stub") 

回答

25

Int是value class,它與其他類有所不同。沒有進入遞歸定義,沒有辦法在scala中表達原始的加法。例如,如果+的定義是,

def +(x: Int): Int = this + x 

然後調用+將調用+這將調用其+ ...

斯卡拉需要對價值類中的方法編譯成增加用Java字節碼/減法/等。

編譯器不會將java編譯成字節碼,但scala庫作者用stub方法編寫了Int.scala以使其成爲有效的scala源文件。這些存根方法從未被實際調用過。

7

正如實現所述,該方法是一個存根。很明顯,它的實現是在編譯代碼時由Scala編譯器提供的,因爲int + int是一個基本操作,Scala語言本身沒有原語 - 只有編譯器知道JVM上的原語。

7

重要的是要認識到,操作符是一種方法,作爲與語言交互的方式。 Int上的+像Scala中的其他方法一樣起作用,而不是按照自己的規則進行操作。

然而,在執行層面,他們沒有方法都:到JVM只有類有方法,且AnyVal子類是不是類儘可能的JVM關注。毫不奇怪,在實現級別上,它們大部分都像Java原語一樣行事。