Hatena::Grouprubyist

Going My Ruby Way このページをアンテナに追加 RSSフィード

Ruby ロゴ (C) Ruby Association LLC

2010年11月09日(火)

クロージャ

| 10:02 | クロージャ - Going My Ruby Way を含むブックマーク はてなブックマーク - クロージャ - Going My Ruby Way クロージャ - Going My Ruby Way のブックマークコメント

$ irb
>> def make_counter
>>   count = 0
>>   proc { count += 1 }
>> end
=> nil
>> cnt = make_counter
=> #<Proc:0xb7658ef4@(irb):3>
>> cnt.call
=> 1
>> cnt.call
=> 2
>> cnt.call
=> 3
>> cnt.call
=> 4
>> undef make_counter
=> nil
>> cnt.call
=> 5
>> cnt.call
=> 6
>> cnt.call
=> 7

>> c = proc { cnt = 0 ; proc { cnt += 1 } }.call
=> #<Proc:0xb764a804@(irb):16>
>> c.call
=> 1
>> c.call
=> 2
>> c.call
=> 3
# ただし、この場合は
>> cnt = 10
=> 10
>> c.call
=> 11           # ...となる

# これなら
>> c = proc {|*cnt| cnt[0] = 0 ; proc { cnt[0] += 1 } }.call
=> #<Proc:0xb7794534@(irb):30>
>> c.call
=> 1
>> c.call
=> 2
>> c.call
=> 3
>> cnt = 10
=> 10
>> c.call    # ...よし
=> 4
>> c.call
=> 5