Procとlambdaの説明する時に書いたサンプル。
rubyの勉強会した時にblock、proc、lambdaについてちょっと理解が曖昧なところがあり、うまく説明しきれなかったので、復習した。
で、参考になる記事があったので、それを元に理解するために自分で手でコード書いてみた。
そのときのコードを覚え書きの意味を込めて載せておく。
$:.unshift(File.dirname(__FILE__)) # blockの例 (1..5).each do |n| p n end def hello_block(&block) p '明示的にblockを引数で受け取りcallで実行' block.call end hello_block do p 'hello block' end def hello_block2(message, &block) p '引数だって渡せる。その場合は、blockは最後に宣言' p message block.call end hello_block2('hogehoge') do p 'hello block2' end def hello_block3 # &blockを省略 p '明示的にblockを引数で受け取りcallで実行' yield # block.callと同じ end hello_block3 do p 'hello block3' end # procはblockをオブジェクト化したもの # 引数も渡す定義をかける。この場合は一つ引数を受け取る場合を書いている。 proc = Proc.new do |s| p 'hello proc' p s end proc.call # 引数セットしなくてもOK proc.call 'yoyohooooooo' # 引数セットすると # lambda lambda = lambda { p 'hello lambda' } lambda.call lambda2 = lambda { |val| p "hello lambda #{val}" } lambda2.call('hogehoge') # lambda2.call こちら引数valを宣言しているので、セットしないとエラーになる # procとの違いは一つ上記のような引数のチェックにある # lambdaのクラスは?? p lambda.class def hello_block4 if block_given? yield(8) end p 'hello block4' end hello_block4 hello_block4 do |n| p 'blockを付けて呼び出す' n += 1 p n end