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

del*_*ber 7 scala

例如,请参阅以下内容

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

代码使用

val oneHalf = new Rational(1, 2) 
Run Code Online (Sandbox Code Playgroud)

有没有办法做类似的事情

val oneHalf: Rational = 1/2
Run Code Online (Sandbox Code Playgroud)

mis*_*tor 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
Run Code Online (Sandbox Code Playgroud)


Kri*_*mbe 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

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

scala> 1.r / 2
res0: Rational = Rational(1,2)
Run Code Online (Sandbox Code Playgroud)