前に紹介したまるごと Ruby! Vol.1を軽く流し読みしています・・・が。
JavaとRubyとを比較しながらの入門記事が特集になっているのですが、一つ目のサンプルコードの意味がわからなくてつまずきました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これで今までわからなかったサンプルも読める気がする。
でも、どういったときに使えばいいのかは、相変わらずピンとこないな・・・。イテレータを実装したいときに使うんだろうけど???