def make_power_gen
prev = 1
Proc.new{
prev = prev * 2
}
end
power_gen_1 = make_power_gen
print "power_gen_1: ", power_gen_1.call, ", ", power_gen_1.call, "\n"
power_gen_2 = make_power_gen
print "power_gen_2: ", power_gen_2.call, ", ", power_gen_2.call, ", ", power_gen_2.call, "\n"
print "power_gen_1: ", power_gen_1.call, ", ", power_gen_1.call, "\n"
実行結果
power_gen_1: 2, 4
power_gen_2: 2, 4, 8
power_gen_1: 8, 16
出力例では、make_power_gen を2回呼び出して関数を2つ(power_gen_1とpower_gen_2)作り出し、それぞれ何回か実行している。ポイントは、power_gen_1 における変数 prev の値が、power_gen_2 の実行によって影響を受けていないこと。つまり、関数ジェネレータ make_power_gen がきちんと機能している。クロージャーでなく、変数 prev が関数内でローカルなスコープを持っていたら、こんなとき power_gen_1, … ,power_gen_n をすべて個別に定義するしかない。
0 件のコメント:
コメントを投稿