2017.07 «  - - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 - - » 2017.09
TOP > Proc.new と proc と lambda と yield と部屋とYシャツと私

 ← rails の flash を使ってみる・その1【rails の flashの基本】 | TOP | yield が分からないので勉強する

スポンサーサイト 

--年--月--日 (--)
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


【広告】

[--.--.--(--) --:--] スポンサー広告 | Trackback(-) | Comment(-)
↑TOPへ

Proc.new と proc と lambda と yield と部屋とYシャツと私 

2007年12月04日 ()
今回は Ruby のバージョン 1.8.5 でお送りいたします。他バージョンでの動作は、自分で試してね、ってことで。

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 の相違点を説明していました。鋭い観点です。

【広告】

[2007.12.04(Tue) 15:28] Rubyの文法Trackback(0) | Comments(2)
↑TOPへ


COMMENT

感謝 by shineble
凄く良くわかりました。ありがとうございます。
愛理ちゃんが表示されるとうれしい♪

こちらこそコメントありがとうございます by 自分
今読み返してみると、へぇー自分でこんなエントリ書いたんだ、と逆に新鮮でした。
'愛理ちゃん'がどうのこうのというコメントをいただいてこれはスパムコメントか?!と一瞬思ってしまいましたが、'愛理ちゃん'の出典元は私の記事でしたのね orz
これからもちょこちょことお立ち寄りください。

コメントを閉じる▲
 ← rails の flash を使ってみる・その1【rails の flashの基本】 | TOP | yield が分からないので勉強する

COMMENT

凄く良くわかりました。ありがとうございます。
愛理ちゃんが表示されるとうれしい♪
[ 2008.09.18(Thu) 17:32] URL | shineble #4s/SiwqE | EDIT |

今読み返してみると、へぇー自分でこんなエントリ書いたんだ、と逆に新鮮でした。
'愛理ちゃん'がどうのこうのというコメントをいただいてこれはスパムコメントか?!と一瞬思ってしまいましたが、'愛理ちゃん'の出典元は私の記事でしたのね orz
これからもちょこちょことお立ち寄りください。
[ 2008.09.19(Fri) 17:00] URL | 自分 #RaJW5m0Q | EDIT |

COMMENT POST















管理者にだけ表示

 ← rails の flash を使ってみる・その1【rails の flashの基本】 | TOP | yield が分からないので勉強する
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。