有没有办法在不使用“new”的情况下初始化Scala对象?

时间:2011-07-09 02:56:57

标签: scala

例如,请参阅以下

http://www.artima.com/pins1ed/functional-objects.html

代码使用

val oneHalf = new Rational(1, 2) 

有没有办法做类似

的事情
val oneHalf: Rational = 1/2

2 个答案:

答案 0 :(得分:7)

我建议您为\字面值使用其他运算符(例如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

答案 1 :(得分:5)

我要窃取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)
  }
}

然后你可以做这样的事情,我觉得它比使用反斜杠更好一些,而且更加一致,因为你还是想在Rational上定义所有常用的数字运算符:

scala> 1.r / 2
res0: Rational = Rational(1,2)