在Scala REPL中的操作重载

3

这可能是一个非常简单的答案,但是 - 我该如何重载一个运算符?

显然的解决方案似乎失败了,虽然我可能误解了出了什么问题:

scala> def +(s:Int): Int = {print (s); this + s}
$plus: (s: Int)Int

scala> 1 + 2
res20: Int = 3

自然我期望得到的是类似于2res20: Int = 3这样的结果。我做错了什么?

我猜你在这里尝试覆盖重载,而不是重载,因为Int已经定义了这个运算符。 - tkachuko
你认为你定义的 + 方法与 1 + 2 中调用的方法相对应,是什么让你这样想的? - jub0bs
1个回答

3

在Scala中,所有运算符都是方法。如果要重载现有方法(例如Int已经定义了+方法),唯一的方法是继承并override+方法,然后你需要在派生类型上操作。

至于重载,当在REPL中定义一个def +方法时,实际上没有真正地重载Int(说实话,我相当惊讶这个方法通过了REPL中对this的使用编译)。你所做的只是创建了一个接受单个参数的+方法。如果要为Int创建一个新的重载,你需要使用pimp my library模式,或者在Scala>= 2.10中使用implicit class

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

1
@Jubobs 肯定是可能的,但对于这个例子来说并不关键。 - Yuval Itzchakov
1
@Jubobs 我也感到很惊讶,似乎this.getClass返回了一个奇怪的类型:res1: type = @4d591d15。不确定REPL在背后进行了什么魔法才使其工作。 - Yuval Itzchakov
1
@VictorMoroz 是的 - jub0bs
@YuvalItzchakov +(Any,Int),确实是这样的吗? - linkhyrule5
1
@linkhyrule5,这并不是在REPL或通常定义方法时发生的事情,很抱歉让你失望了 :). 这是您的方法发生的情况 - Yuval Itzchakov
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接