这可能是一个非常简单的答案,但是 - 我该如何重载一个运算符?
显然的解决方案似乎失败了,虽然我可能误解了出了什么问题:
scala> def +(s:Int): Int = {print (s); this + s}
$plus: (s: Int)Int
scala> 1 + 2
res20: Int = 3
自然我期望得到的是类似于
2res20: Int = 3
这样的结果。我做错了什么?这可能是一个非常简单的答案,但是 - 我该如何重载一个运算符?
显然的解决方案似乎失败了,虽然我可能误解了出了什么问题:
scala> def +(s:Int): Int = {print (s); this + s}
$plus: (s: Int)Int
scala> 1 + 2
res20: Int = 3
2res20: Int = 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
this.getClass
返回了一个奇怪的类型:res1: type = @4d591d15
。不确定REPL在背后进行了什么魔法才使其工作。 - Yuval Itzchakov+(Any,Int)
,确实是这样的吗? - linkhyrule5
+
方法与1 + 2
中调用的方法相对应,是什么让你这样想的? - jub0bs