は以下の"new"を使わずにScalaオブジェクトを初期化する方法はありますか?例えば
http://www.artima.com/pins1ed/functional-objects.html
を参照してくださいコードは
val oneHalf = new Rational(1, 2)
を使用しています
val oneHalf: Rational = 1/2
は以下の"new"を使わずに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オブジェクトを返すことになります。それは面白いだろう! –