参考: https://shinmedia20.com/ruby-proc
sample.rb
addAB = Proc.new { |a,b| a.to_i+b.to_i }
#ブロックをオブジェクト化
puts "和は#{addAB.call(2,4)}です。"
#callで実行することでオブジェクト化したブロックの処理を行える。
puts "三つ目の引数を加えた和は#{addAB.call(2,4,4)}"
#三つ目の引数は無視される
def sample(&sample_proc)
#引数にブロックを渡すsampleメソッド
#引数に&をつけることでブロックだと認識させている。
puts sample_proc.call(2)
#渡されたブロックに引数を2を渡して実行する。
end
sample { |n| n**4 }
#sampleメソッドに引数 { |n| n**4 } を渡している。
#sampleメソッド内でブロック変数2を渡してブロックを実行している。
def sample2 (&block)
puts block.call(3)
end
sample2 { |n| n*n }
##出力値は 9
def sample3(&block)
puts yield(5)
# yield は引数で渡されたブロックを実行する
# つまり渡された引数(ブロック)に対してcallメソッドを使わなくても良い。
end
sample3 { |n| n*n }
def sample4
# sample3の引数(ブロック)の記述なしver
puts yield(6)
end
sample4 { |n| n*n }
def sample5
if block_given?
#メソッドに引数としてブロックを渡したか判定
#渡しているなら true , 渡していないなら false
puts yield
else
puts "blockは渡されませんでした"
end
end
sample5
## 引数を渡していない : expect => blockは渡されませんでした
sample5 { puts "blockです" }
## 引数を渡している : expect => blockです