2011-07-09 6 views
7

は以下の"new"を使わずにScalaオブジェクトを初期化する方法はありますか?例えば

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

を参照してくださいコードは

val oneHalf = new Rational(1, 2) 

を使用しています

val oneHalf: Rational = 1/2 
+0

私はあなたの例がちょうど擬似コードであることを知っていますが、私はそれが好きです!その作業を行うために、Intsの代わりに/演算子をオーバーロードして、Rationalオブジェクトを返すことになります。それは面白いだろう! –

答えて

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

'÷'( '\ u00f7')はどうですか?それ以外の場合は、2が1を超えているように見えます。 – huynhjl

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) 
    } 
} 

その後、あなたは私はあなたがとにかく合理的にすべての通常の数値演算子を定義したいと思うので、少しバックスラッシュを使用するよりもよりよい、そしてより一貫性があると思われ、このような何かを行うことができます。

scala> 1.r/2 
res0: Rational = Rational(1,2) 
関連する問題