例如看到下面的有沒有方法來初始化Scala對象而不使用「新」?
http://www.artima.com/pins1ed/functional-objects.html
代碼使用
val oneHalf = new Rational(1, 2)
有沒有辦法做這樣的事情
val oneHalf: Rational = 1/2
例如看到下面的有沒有方法來初始化Scala對象而不使用「新」?
http://www.artima.com/pins1ed/functional-objects.html
代碼使用
val oneHalf = new Rational(1, 2)
有沒有辦法做這樣的事情
val oneHalf: Rational = 1/2
我會建議使用一些其他的運營商(比方說\
)爲您的Rational
文字,如/
已經在所有數字類型上定義爲除法操作。
scala> case class Rational(num: Int, den: Int) {
| override def toString = num + " \\ " + den
| }
defined class Rational
scala> implicit def rationalLiteral(num: Int) = new {
| def \(den: Int) = Rational(num, den)
| }
rationalLiteral: (num: Int)java.lang.Object{def \(den: Int): Rational}
scala> val oneHalf = 1 \ 2
oneHalf: Rational = 1 \ 2
'÷'('\ u00f7')怎麼樣?否則\使2看起來像是超過1。 – huynhjl
我要偷MissingFaktor的答案,但稍微改變它。
case class Rational(num: Int, den: Int) {
def /(d2: Int) = Rational(num, den * d2)
}
object Rational {
implicit def rationalWhole(num: Int) = new {
def r = Rational(num, 1)
}
}
然後,你可以做這樣的事情,我認爲這是比用反斜槓更好一點,更一致的,因爲你會想反正定義有理所有常見的數值運算符:
scala> 1.r/2
res0: Rational = Rational(1,2)
我知道你的例子只是僞代碼,但我喜歡它!爲了完成這個工作,可以重載Ints上的/運算符來返回Rational對象而不是Ints。那很有趣! –