A Day in the Life

2007-11-04

1.9 Enumerator

それっぽいのなんでも Enumerator にして Enumerator chain で繋げられるのはいいなぁ。

>> %w(red blue green).cycle.with_index.take(10).each {|color, i| puts "#{i+1}, #{color}"}
1, red
2, blue
3, green
4, red
5, blue
6, green
7, red
8, blue
9, green
10, red

Enumerator はイテレータとしても使える。next で次のを返し、next が呼べないと例外 StopIteration が発生する。index を 0 に戻すにはお馴染み rewind。

>> el = [1,2].each
=> #
>> el.next
=> 1
>> el.next
=> 2
>> el.next
StopIteration: iteration reached at end

loop のブロック内側では StopIteration の例外を受け取ると抜ける。

>> el.rewind
=> #
>> loop { puts el.next }
1
2
=> nil
>> Class.class_eval 'alias succ superclass'
=> nil
>> (StopIteration..BasicObject).to_a
=> [StopIteration, IndexError, StandardError, Exception, Object, BasicObject]

JRuby で何故 ObjectSpace が遅すぎるのか

JRuby のプレゼンでゆってて、なんでなんだろ、とささださんに訊いてみたら 1.8/1.9 の GC は直接さわれるので ObjectSpace#each_object をまんま呼び出せるんだと。なるほど。JRuby のほうは JVM 任せだから今どのオブジェクトが生きてるかどうかの管理を ObjectSpace 使うと自前でやらなくちゃならない。

プレゼン中に test/unit なんかの場合の ObjectSpace は効率的にやるほうほうがとか云ってた気がするけどあれなんなんだろ。

いんぽっど

PCからiPod充電したいだけなのに iTunes が必要で起動して立ち上げてデバイスのロック解除(充電しつつiPodを再生したい)とかめんどくさすぎる。iPod の充電&ロック解除してくれるツールってなんかないのかなぁ、iTunes 以外で。

記事の一覧 >