2013-06-24 46 views
0

這是一個相當假設的問題,但我們假設我想在範圍內改變(或任何其他算術運算符)在Int上的行爲,像這樣(我知道這是瘋狂的東西, ð儘量避免一般,但我覺得很有意思):是否有可能重寫Scala中的內置運算符?

object MySillyStuff extends App { 
    def +(a: Int, b: Int) = a*b; 

    println(1+2) 
} 

這是可能的這種方式,或者我只能通過超載隱式轉換運營商一個新的類型? (即,我必須明確地創建1作爲該新類型的成員,並針對該特定類型使用2的隱式轉換)。

回答

4

請注意,scala中沒有運算符。在問題+Int的方法:(1).+(2)

覆蓋現有方法的唯一方法是使用override關鍵字繼承。

隱式類允許您添加新方法,但不能覆蓋已存在的方法。

你可以換你的課,而不會開銷中value classes這樣的:

case class StrangeInt(val i: Int) extends AnyVal { 
    def +(that: Int): StrangeInt = StrangeInt(i*that) 
} 

val i = StrangeInt(3) 
println(i+3) 
// StrangeInt(9) 
+0

好了,所以基本上我不能這樣做。雖然通過壓倒'Predef'中的某些東西,但還沒有看到任何操作符,但有一些破解。 Thx爲澄清,senia! – rlegendi

+0

@rlegendi:scala中沒有運算符。 '+'是'Int'的方法:'(1)。+(2)'。它與'Predef'沒有任何關係。 – senia

+2

你能證明你的例子中發生了乘法,而不是加法? ;-) –

相關問題