Groovy でリストのかけ算

元ネタ: http://d.hatena.ne.jp/atsuoishimoto/20110409/1302347562
Groovy でも同様で*1

groovy:000> a = [[]] * 5
===> [[], [], [], [], []]
groovy:000> a.head() << 'A'
===> [A]
groovy:000> a
===> [[A], [A], [A], [A], [A]]


別のインスタンスにしたかったらこんなやり方もある。

groovy:000> a = ([{ [] }]*5)*.call()
===> [[], [], [], [], []]
groovy:000> a.head() << 'A'
===> [A]
groovy:000> a
===> [[A], [], [], [], []]


これ考えたのは『Scala スケーラブルプログラミング』の 18 章で*2

val a, b, c = new Wire

を見たとき。
C言語Java の目で見ると c しか初期化していないと思ってしまうが a, b, c それぞれに new Wire している。*3


Groovy でどう書く?とそのとき考えたメモ。

def (a, b, c) = [new Wire(), new Wire(), new Wire()]
def (a, b, c) = new Wire[3].collect { new Wire() }
def (a, b, c) = ([{ new Wire() }] * 3)*.call()
def (a, b, c) = ([Wire] * 3)*.newInstance()

Groovy には様々な方法があるので他にもあるかもしれない。


Scala で実際に使われているのを見たこともあって書いておく。

*1:Python の文法を知らないが見た限りでは

*2:この章で新しいことはこれしかなかった気がする。特別な章だった

*3:この例は val なんでそれはないと気づく人もいるかもしれないが