2016-10-04 5 views
0

引数がない場合、paranthesisのないメソッドを定義することができます。特殊なユースケースは、これを使用して値を取得することです。私はこれを行うか、むしろ直接価値を得るべきですか?Scalaで直接またはメソッドを使用して値を取得しますか?

ので

class Complex(real: Double, imaginary: Double) { 
    def re = real 
    def im = imaginary 
    override def toString() = 
    "" + re + (if (im < 0) "" else "+") + im + "i" 
} 

または

class Complex(real: Double, imaginary: Double) { 
    val re = real 
    val im = imaginary 
    override def toString() = 
    "" + re + (if (im < 0) "" else "+") + im + "i" 
} 
+0

なぜこれらのdefsまたはvalsがコンストラクタargsから離れているのですか?なぜ、 'class Complex(double、val im:Double){override def toString()= ...} 'だけではないのですか? – Jesper

+0

@Jesper:率直に言って、私はhttp:// docsから来ています。 scala-lang.org/tutorials/scala-for-java-programmers.html – Make42

+0

このチュートリアルでは、Scalaの機能については説明していません。コンストラクタargsの前に 'val'を置くと、2番目の例と同じ効果が得られます。 – Jesper

答えて

2

あなたが効果的にコードの2番目の作品と同じである、それは少し短くするコンストラクタ引数の前にvalを置くことができます。

class Complex(val re: Double, val im: Double) { 
    override def toString() = "" + re + (if (im < 0) "" else "+") + im + "i" 
} 

defは、方法valは最終メンバー変数を定義します。これらの2つのメソッドの戻り値は固定されているので、実際にそれらをメソッドにする理由はありません。この場合、defの代わりにvalを使用してください。

+0

サブクラスで 'def'sでそれらをオーバーライドしない限り、メソッドを作る方法は本当にありません。 –

+0

@VictorMorozはい、この特定のケースでは、複雑ではないような複雑な数を表す' Complex'クラスがあります。 – Jesper

1

さらに良い:それ場合クラスます

case class Complex(re: Double, im: Double) { 
    override def toString() = "%f%+fi".format(re,im) 
} 

これはあなたのメンバーとしてreimを与え、プラスなどcopyなどいくつかの追加特典:

val a = Complex(1,2) 
val realA = a.copy(im = 0) 

unapply

def isImaginary(a: Complex) = a match { 
    case Complex(0, _) => true 
    case _ => false 
} 

def abs(a: Complex) = a match { 
    case Complex(re, im) => re*re + im*im 
} 

およびequals,hashCodeなど

+0

最後に、 'case class'esは' toString'の実装を提供しています。これは、例えば、 "Complex(4.2、4.7)"のようなものにレンダリングされます。さらに、 'toString'メソッドをオーバーライドしたい場合は、' def'の代わりに 'val'を使ってそれをオーバーライドすることもできます。その値はあなたがそれを求める度に再計算されません。あなたのクラスの個々のインスタンスを、コードの中で文字列として複数回レンダリングすること(ロギング目的など)。 – stefanobaghino

関連する問題