scala - Scala: methodoperator重载

  显示原文与译文双语对照的内容

下面的例子来自 book'在 Scala 中编程'。 给定类'有理数'和下面的方法定义:


def add(that: Rational): Rational =


 new Rational(


 this.numer * that.denom + that.numer * this.denom,


 this.denom * that.denom


 )



使用Int参数,使用Int参数,可以成功重载add方法,并且使用了上面的定义中的


def add(that: Int): Rational =


 add(new Rational(that, 1))



目前没有问题。

现在,如果将方法 NAME 更改为运算符样式名称,请执行以下操作:


def +(that: Rational): Rational =


 new Rational(


 this.numer * that.denom + that.numer * this.denom,


 this.denom * that.denom


 )



像这样重载:


def +(that: Int): Rational =


 +(new Rational(that, 1))



我得到以下编译错误:


(fragment of Rational.scala):19: error: value unary_+ is not a member of this.Rational


+(new Rational(that, 1))


 ^



编译器为什么要查找 + 方法的一元版本?

时间: 原作者:

Scala的类型 +x-x~xx 转换为方法调用 x.unary_+,它部分地允许java像boolean的语法,或者 -x 作为number的否定,或者 x number 。!

因这里,代码段 +(new Rational(that, 1)) 被转换为 (new Rational(that,1)).unary_+,并且 Rational 没有这里方法,你得到了一个编译错误。 当函数被调用为 +-~ 或者 时,才会出现这里错误,因为它们是唯一的字符 Scala 允许作为一元运算符。! 例如如果调用了函数 @+,代码将编译得很好。

不过,我建议将重写的添加函数编写为:


def +(that: Int): Rational =


 this + (new Rational(that, 1))



这个代码显示了你的函数的意图更好 --,你将一个从整数构造的新 Rational 作为分母和 1 。 这种写入方式被转换为 this.+(new Rational(that, 1)),这就是你希望--在 this 上调用 + 函数的内容。

请注意,你可以使用中缀符号,但是函数被调用。 例如如果将名称更改为 add,则仍可以保持定义为:


def add(that: Int): Rational =


 this add (new Rational(that, 1))



原作者:
...