hitode909の日記

趣味はマリンスポーツですの日記です

RubyのGeneratorが便利な例を考えた

ライブラリのインターフェイスが変なときにGeneratorを使ってましにできることがある.


MeCabRubyバインディングのインターフェイスがださくて,使いにくかった.
分かち書きして,名詞だけ表示するようなとき,普通に書くとこうなる.

c = MeCab::Tagger.new("-O wakati")
node = c.parseToNode(text)

while node do
  puts node.surface if node.feature =~ /^名詞/
  node = node.next
end

whileとか,node = node.nextとかが,Rubyっぽくない.


Generatorに入れて1個ずつ返すようにすると,Enumlatorを使えるようになって,だいぶましになる.

c = MeCab::Tagger.new("-O wakati")
node = c.parseToNode(text)

Generator.new{|g|
  while node do
    g.yield node
    node = node.next
  end
}.select{|node|
  node.feature =~ /^名詞/
}.each{|node|
  puts node.surface
}


node = node.nextとか書かされるライブラリはMeCab以外に知らないけど,他にもそういうのがあれば同じように使えそう.