斯卡拉教程困惑說Int
的添加操作實際上是一個方法調用:1+1
意味着1.+(1)
通過Int的操作定義在斯卡拉
但是,當我看着的Int.scala
的源代碼,它看來,方法將只是打印一條錯誤消息。任何人都可以向我解釋這是如何工作的?
def +(x: Int): Int = sys.error("stub")
斯卡拉教程困惑說Int
的添加操作實際上是一個方法調用:1+1
意味着1.+(1)
通過Int的操作定義在斯卡拉
但是,當我看着的Int.scala
的源代碼,它看來,方法將只是打印一條錯誤消息。任何人都可以向我解釋這是如何工作的?
def +(x: Int): Int = sys.error("stub")
Int是value class,它與其他類有所不同。沒有進入遞歸定義,沒有辦法在scala中表達原始的加法。例如,如果+的定義是,
def +(x: Int): Int = this + x
然後調用+將調用+這將調用其+ ...
斯卡拉需要對價值類中的方法編譯成增加用Java字節碼/減法/等。
編譯器不會將java編譯成字節碼,但scala庫作者用stub方法編寫了Int.scala以使其成爲有效的scala源文件。這些存根方法從未被實際調用過。
正如實現所述,該方法是一個存根。很明顯,它的實現是在編譯代碼時由Scala編譯器提供的,因爲int + int
是一個基本操作,Scala語言本身沒有原語 - 只有編譯器知道JVM上的原語。
重要的是要認識到,操作符是一種方法,作爲與語言交互的方式。 Int
上的+
像Scala中的其他方法一樣起作用,而不是按照自己的規則進行操作。
然而,在執行層面,他們沒有方法都:到JVM只有類有方法,且AnyVal
子類是不是類儘可能的JVM關注。毫不奇怪,在實現級別上,它們大部分都像Java原語一樣行事。