Ruby Procを触る
引数にブロックを取る関数。
def doSomething(something, &toDo) toDo.call(something) end
PHP = 無名関数
Ruby = ブロック
という考え方で良いと思う。
以下、do から end がブロック。
Rubyでは、ブロックも引数の一種に考えるイメージだろうか。
doSomething 'メロン' do |food| p food << 'を食べる' end
メロンを食べる
ではそのブロック(無名関数)を変数に入れたい場合はどうするか。
Procオブジェクトとしてラッピングする必要がある。
def doSomething(something, toDo) toDo.call(something) end eatFood = Proc.new do |food| p food << 'を食べる' end doSomething 'リンゴ', eatFood
リンゴを食べる
こっちは、doSomethingの引数toDoに「&」が無い。
# ブロックを渡す場合 def doSomething(something, &toDo) # Procオブジェクトを渡す場合 def doSomething(something, toDo)
この「&」は、普通のブロックをProcオブジェクトに変換している…らしい。
Procオブジェクト。まだよく分からないが、ここらへんを理解できると、後々楽になりそうな気がする。