2016-07-03 47 views
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。我究竟做錯了什麼?

+0

我猜你正在嘗試做覆蓋這裏,不超載爲INT有已經定義了該運算符。 – tkachuko

+0

是什麼讓你認爲你定義的'+'方法對應於在'1 + 2'中調用的方法? – Jubobs

回答

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 
+0

爲什麼不讓'PimpedInt'擴展'AnyVal'? – Jubobs

+1

@Jubobs絕對有可能,但對於這個例子並不重要。 –

+0

同意。我很驚訝'def +(s:Int):Int = {print(s);這個+ s}'在REPL中完全編譯。在這種情況下,「this」指的是什麼? – Jubobs