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 で実際に使われているのを見たこともあって書いておく。