對此可能是一個非常簡單的答案,但是 - 如何重載操作符?Scala中的操作超載REPL
顯而易見的解決方案似乎是失敗的,但有可能我誤解什麼錯:
scala> def +(s:Int): Int = {print (s); this + s}
$plus: (s: Int)Int
scala> 1 + 2
res20: Int = 3
當然,我期待像2res20: Int = 3
。我究竟做錯了什麼?
對此可能是一個非常簡單的答案,但是 - 如何重載操作符?Scala中的操作超載REPL
顯而易見的解決方案似乎是失敗的,但有可能我誤解什麼錯:
scala> def +(s:Int): Int = {print (s); this + s}
$plus: (s: Int)Int
scala> 1 + 2
res20: Int = 3
當然,我期待像2res20: Int = 3
。我究竟做錯了什麼?
在斯卡拉,所有的操作符都是方法。爲了覆蓋現有方法(因爲Int
已經定義了+
方法),唯一的方法是繼承和override
方法,然後您需要對派生類型進行操作。
至於超載,定義在REPL一個def +
方法時,你是不是真的超載Int
(坦率地說,我很驚訝這個方法用在REPL使用this
編譯)。你所做的只是創建一個只有一個參數的方法+
。爲了創造Int
一個新的過載,你需要使用pimp my library pattern,或在斯卡拉>通過implicit class = 2.10:
scala> implicit class PimpedInt(x: Int) {
| def +(i: Int, s: String): Int = {
| println(s)
| x + i
| }
| }
defined class PimpedInt
scala> 1 + (1, "hello")
hello
res8: Int = 2
我猜你正在嘗試做覆蓋這裏,不超載爲INT有已經定義了該運算符。 – tkachuko
是什麼讓你認爲你定義的'+'方法對應於在'1 + 2'中調用的方法? – Jubobs