Proc.new と proc と lambda と yield と部屋とYシャツと私
Javascript でいう無名関数っていうのですか、そーいうのを作るのに
Proc.new
proc
lambda
があるらしいです。例を挙げると、こんな感じ。下の例ですと、Proc.new と proc と lambda は全く同じ動きをします。call メソッドを使って定義したブロックを呼び出せます。
my_proc = Proc.new do
puts '平松'
end
my_proc.call # 平松 と表示される
my_proc = proc do
puts '平松'
end
my_proc.call # 平松 と表示される
my_proc = lambda do
puts '平松'
end
my_proc.call # 平松 と表示される
ということでここまでは簡単ですね。
今度は、yield っぽく使いたいという場合ですが、上記と似たようなことをします(上記と異なるのは、do ~ end がいらなくなる点)。ただし、proc と lambda の場合は、warning が表示されちゃいました。
以下をご覧ください。
def method1
yield
end
method1 do
puts '愛理'
end
# 愛理 と表示される
# warning は表示されない
def method1
my_proc = Proc.new
my_proc.call
end
method1 do
puts '愛理'
end
# 愛理 と表示される
# warning は表示されない
def method1
my_proc = proc # warning が出る
my_proc.call
end
method1 do
puts '愛理'
end
# 愛理 と表示される
# warning が表示される
def method1
my_proc = lambda # warning が出る
my_proc.call
end
method1 do
puts '愛理'
end
# 愛理 と表示される
# warning が表示される
↓おまけ
def method1(&block)
block.call
end
method1 do
puts '愛理'
end
# 愛理 と表示される
# warning は表示されない
method1 を呼んだとき、do ~ end が隠れ引数ブロックとして method1 に渡されます。
Proc.new や、proc や lambda を使うときに、後ろに何も書かないと、この隠れ引数ブロックを使うよー、ということになります。
上記のコードでいうと
my_proc = Proc.new # Proc.new の後ろに何も書かないと、隠れ引数ブロックを使うよー、ということ
でもでも、proc や lambda の場合は、後ろに何も書かないと、Proc.new のように、この隠れ引数ブロックを使うよー、と出来るのですが、warning が出てしまいます。
上記のコードでいうと
my_proc = proc # proc の後ろに何も書かないと、隠れ引数ブロックを使うよー、ということにはなるが、warning が出る
という違いがありました。Rubyリファレンスマニュアルには載ってないような気がするんですけど。
まあ、普通は yield を使うのでしょうから、こういった違いに実際に遭遇する人はほとんどいないような気がしてきて虚しい師走の寒い一日でした。
趣味的にっきでは、上記とは違う観点で Proc.new と proc と lambda の相違点を説明していました。鋭い観点です。
【広告】
COMMENT
'愛理ちゃん'がどうのこうのというコメントをいただいてこれはスパムコメントか?!と一瞬思ってしまいましたが、'愛理ちゃん'の出典元は私の記事でしたのね orz
これからもちょこちょことお立ち寄りください。
愛理ちゃんが表示されるとうれしい♪