2016-04-06 10 views
4

に割り当てられた利用価値などのために、マップ内の前のキーに割り当てられた値を使用することが方法です:私は、「C」の値になりたいGroovyのマップ作成、前のキー

def x = [ 
     a: someList.sum(), 
     b: anotherList.sum(), 
     c: someList.sum()/anotherList.sum() 
] 

/b、ショートカットがあるので、 'c'の計算中に合計を再計算する必要はありません

+0

'def a = 1; def x = [a:a、b:a + 1] '? –

+0

これは明らかでしたが、私が探していたものではありませんでした –

+1

あなたはこれを望む理由を説明できますか?私は理論とは別の理由を考えることはできません。 –

答えて

6

新しいキー/値を計算するために以前に追加したキー/値を使用するには、キー/値が追加される順序を制御します。明らかなことは分かりますが、GroovyのMap宣言では順序を考慮していません。キーcの値のための式を評価する場合たとえば、あなたがこれを書いた場合...

def x = [ 
     a: 8, 
     b: 2, 
     c: a/b 
] 

...、Groovyは、変数ので失敗しますれ、aという名前の変数やプロパティにアクセスしようとします/プロパティは存在しません。ただし、そのプロパティの検索を利用してこれを行うことができます:

def x = [:].with { 
    a = 8 
    b = 2 
    c = a/b 

    delegate 
} 

あなたは空のMapを作成することによって開始します。次に、with(Closure)を使用して、Mapに対してputAt()get()を実行します。上記の例では、それがxに割り当てられているようにMap自体を返し、最後に相当する...

def x = [:].with { 
    putAt('a', 8) 
    putAt('b', 2) 
    putAt('c', get('a')/get('b')) 

    delegate 
} 

です。

+0

とても素敵な答えです。 – pczeus

+0

そのようなアプローチを使いたいのであれば、https://gist.github.com/jeffbrown/4182689de487968b9f7f57e8f3ba08aa –

+1

のように簡略化できると思います。 'delegate'の代わりに' it'を返すことができます – Will

関連する問題