重载斜杠运算符以调用自定义对象的方法

时间:2019-06-17 06:58:15

标签: scala operator-overloading traits mixins

我创建了一个名为Rational的类,它是对有理数的简单抽象。其构造函数采用两个参数,分别存储为numerdenom。我的目标是要允许库的用户编写任何形式为x/y的表达式(例如(2/33/1)以及使用有理数({{1 }}等),但是将该表达式的代替发送到FPU以获得商,我希望将参数提供给新的2/3 * 15/16 - 10/31实例,然后将其返回Rational的方法和字段并不重要,除了它的琐碎的Rational

toString

基于讨论here,我创建了一个简单的特征override def toString : String = numer + "/" + denom

Rationalizer

然后我做了一个小的trait Rationalizer { implicit class WrappedInt(val x: Int) { def / (y:Int): Rational = new Rational(x, y) } } 来测试在尝试打印App时是否调用了Rational::toString

2/3

不幸的是,似乎该运算符坚持将其操作数解释为object Runner extends App with Rationalizer{ println(2/3) } 并报告0,即Int的截断结果。

当然,如果我将2/3中重新定义的运算符的名称更改为其他名称,例如Rationalizer

foo

并在我的trait Rationalizer { implicit class WrappedInt(val x: Int) { def foo (y:Int): Rational = new Rational(x, y) } } 实例中进行相应的更改:

Runner

然后称object Runner extends App with Rationalizer { println(2 foo 3) } 就好了。此外,在第一种配置(Rational::toString而不是/)中,将foo的左操作数显式地设置为/实例,并进行如下的WrappedInt调用:

Runner

也会产生所需的结果。 但是,我的目标是让相同的运算符'/'基于object Runner extends App with Rationalizer{ println(new WrappedInt(2) / 3) } 是否混入Runner中而以不同的方式响应(因此,最小的源代码更改),所以我可以比较计算精度与计算速度并生成一些图形。

关于重载Rationalizer并将其融合到我的/中的任何想法吗?

0 个答案:

没有答案