hellkite 日記と雑記とメモ。

Shiki Kazamaの駄文と音楽と、時々技術な感じ

Rubyのyieldがよくわからないので調べてみた


スポンサーリンク


前に紹介したまるごと Ruby! Vol.1を軽く流し読みしています・・・が。
JavaRubyとを比較しながらの入門記事が特集になっているのですが、一つ目のサンプルコードの意味がわからなくてつまずきましたorz
それが、yield。


Rubyレシピブック」のP.23によると、メソッド定義の一種で、ブロックつきメソッドを定義する場合に必要になるそうだ。動きとしては、与えられた引数をブロックパラメータとしてブロックに渡す、だそうな・・・。
うーん、わからん・・・。
Rubyレシピブックのサンプル(7行目追加)

def map_with_index(list)
  result = []
  list.each_with_index{|item, idx|
    value = yield [item, idx]
    result << value
  }
  p result #追加
  return result
end

map_with_index([1,2,3]){|item, idx| item*idx }
[0,2,6]
#=> [0,2,6]


あー、なんとなくわかったような気がする。
map_with_indexの中で呼ばれたyieldの引数が、map_with_indexの後ろに続くブロックに渡されて、その処理結果(この場合は、item*idx)がyieldの戻り値として返ってくるってことか。
自分、map_with_indexの結果が、その後ろのブロックに渡されると思っていた。つまり、「追加」の部分での出力が[[1,0], [2,1], [3,2]]になると考えていた。全然違ったwwwこれで今までわからなかったサンプルも読める気がする。


でも、どういったときに使えばいいのかは、相変わらずピンとこないな・・・。イテレータを実装したいときに使うんだろうけど???