2013-06-24 43 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

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

相关问题