我创建了一个名为Rational
的类,它是对有理数的简单抽象。其构造函数采用两个参数,分别存储为numer
和denom
。我的目标是要允许库的用户编写任何形式为x/y
的表达式(例如(2/3
,3/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
并将其融合到我的/
中的任何想法吗?