孤独プログラマー譚

孤独死が近い。

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を制する者がRubyを制す(嘘)

Procオブジェクト。まだよく分からないが、ここらへんを理解できると、後々楽になりそうな気がする。