2016-12-30 15 views
1

私は3つのBigDecimal引数を受け取り、何かを計算する再利用可能なメソッド(実際にはもっと複雑です)を持っているとしましょう。計算後、入力パラメータが内部で変更され、次の計算などのために3つすべてが外側に必要です。Scala - 複数の可変パラメータ参照またはオブジェクトへのポインタの参照渡し

ただ1つの引数であれば、戻り値として返すことができます。

Scalaでこのことを行うにはどのような方法がありますか?

object MutableTest extends App { 

    def mutableMethodWithComplicatedButReusableLogic(a: BigDecimal, b: BigDecimal, c: BigDecimal) = { 
    a = b + c 
    c = b * a 
    b = 0 
    //All three of changed args should be available outside 
    } 

    var a: BigDecimal = 10 
    var b: BigDecimal = 11 
    var c: BigDecimal = 12 

    //1. step 
    mutableMethodWithComplicatedButReusableLogic(a, b, c) 

    //2. step a, b, c should change in step 1 and 
    mutableMethodWithComplicatedButReusableLogic(a*b, b, c -1) 
    .... 

} 

これはもちろんで終わり:タイムコンパイルエラー:valの値(9,7)再割り当てが= B + C

は、グローバル変数が答えである、またはいくつかの変更可能なヘルパーホルダーオブジェクト?

答えて

1

私はちょうどトリプレットまたはケースクラスのインスタンスに計算結果を返す、それらを変異wound't:

def mutableMethodWithComplicatedButReusableLogic(
    a: BigDecimal, b: BigDecimal, c: BigDecimal 
): (BigDecimal, BigDecimal, BigDecimal) = { 
    val newA = ... //Compute a 
    val newB = ... //Compute b 
    val newC = ... //Compute c 
    (newA, newB, newC) // Or whatever other cmputation 
} 
1

あなたが複数の値を返すためのタプルを使用したり、ラップいくつかのラッパーケースクラスを使用することができ、 bおよびc。

def mutableMethodWithComplicatedButReusableLogic(a: BigDecimal, b: BigDecimal, c: BigDecimal): (BigDecimal, BigDecimal, BigDecimal) = { 
(b + c, 0, b * (b + c)) 
} 

使用法:

val (a, b, c) = mutableMethodWithComplicatedButReusableLogic(1, 2, 3) 

ケースクラスを使用して

case class Wrapper (val a: BigDecimal, val b: BigDecimal, val c: BigDecimal) 

def mutableMethodWithComplicatedButReusableLogic(wrapper: Wrapper): Wrapper = { 
    Wrapper((wrapper.b + wrapper.c, 0, wrapper.b * (wrapper.b + wraper.c))) 
} 
(つまり、ケースクラスで、このトリプレットをラップし、素敵な名前を提供され、これは、コードの保守性を向上させることができますようお勧めの方法です)

用法:

val Wrapper(a, b, c) = mutableMethodWithComplicatedButReusableLogic(Wrapper(1, 2, 3)) 

一般的な提案

できるだけ突然変異を使用しないでください。不変にしてください、これはあなたのソフトウェアが成長したときにバグフリーになる唯一の方法です。関数もテスト可能になり、リファクタリングは簡単です。コードは宣言的で読みやすくなります。戻り値の型を使用して関数から外界と通信する。 単純なタプルを使用する代わりに、戻り値の型クラスに意味のある名前を付けてください。

全体のパフォーマンスを向上させることができる場合にのみ、状態を使用します。常にコンテナの内部に状態を入れ、他の外部のエンティティが状態を操作できるようにすることはできません。

このようにすれば、生活の中で問題が少なくなり、早く家に帰ることができます。

+0

(A、B、C)= mutableMethodWithComplicatedButReusableLogic(a、b、c)を説明したように、これは動作していない – Levijatanu

+0

http://stackoverflow.com/questions/3348751/scala-multiple-assignment-to-existing-variable – Levijatanu

+0

メソッドの後にvarsをどのように割り当てるべきですか? – Levijatanu

関連する問題