ザネリは列車を見送った

ブログという名の備忘録

CoffeeScript によるデザインパターン(Iterator)

Rubyによるデザインパターン』をCoffeeScriptで書く試み。
目次

外部イテレータ

今回は工夫の余地があまり無さそうだけど、とりあえず原書通りに ArrayIterator クラスを作ってみる。

var array = ["red", "green", "blue"];
var i = new ArrayIterator(array);
while (i.hasNext()) console.log("item: " + i.nextItem());
// 「item: red」
// 「item: green」
// 「item: blue」
内部イテレータ

CoffeeScript の for を使って表現する。

a = [10, 20, 30]
console.log "The element is #{element}" for element in a

「The element is 10」「The element is 20」「The element is 30」が順に表示される。
なお、前回の CompositeパターンでArray を継承した composite3.coffee を作成したが、
あの場合の CompositeTask でも上記の for が使用できる。

task = new MakeBatterTask()
console.log "Sub task: #{subTask.constructor.name}" for subTask in task

「Sub task: AddDryIngredientsTask」「Sub task: MixTask」が順に表示される。

複数のイテレータを同時に扱う

何だか収まりが悪い気がするが、こちらを今回の完成形としよう。

var array1 = [1,3,5,7,9];
var array2 = [2,6,10];
console.log(merge(array1, array2));
// [1, 2, 3, 5, 6, 7, 9, 10]
specs2で単体テスト

merge メソッドはイテレータの本来の目的ではないが、ついでにテスト。