yield
yield が書かれたメソッドに渡されたブロックを実行する。
一番シンプルな例
def test
yield
end
test { p "hoge" }
=> "hoge"
引数を1つ渡す場合
def test
yield "hoge"
end
test {|x| p x }
=> "hoge"
引数を2つ渡す場合
def test
yield "hoge", "fuga"
end
test {|x, y| p x, y }
=>
"hoge"
"fuga"
ブロックがあるか、ないかを判定する
def test
if block_given?
yield
else
p "no blcock"
end
end
test { p "hoge" }
test
=>
"hoge"
"no blcock"
Proc
ブロックを表すクラス。
一番シンプルな例
# 引数にブロックを与えて初期化する
proc = Proc.new {p "test"}
# callでブロックを実行する
proc.call
=> "test"
引数を1つ渡す場合
# 引数にブロックを与えて初期化する
proc = Proc.new {|x| p x}
# ブロックを実行する
proc.call(["hoge"]) # proc["hoge"] または proc.("test")でも同じ
=> "hoge"
引数を2つ渡す場合
# 引数にブロックを与えて初期化する
proc = Proc.new {|x,y| p x,y}
# ブロックを実行する
proc.call(["hoge", "fuga"]) # proc["hoge", "fuga"] または proc.("hoge", "fuga")でも同じ
=>
"hoge"
"fuga"
lambda
Proc.new と同じ。
l = lambda {p "hoge"}
l.call
=> "hoge"
lambda は ->
で書ける
l = -> {p "hoge"}
l.call
=> "hoge"
引数を1つ渡す場合
通常の書き方はProcと同じなので、以下省略系のみ紹介
l = -> (x){p x}
l.call("hoge")
=> "hoge"
引数を2つ渡す場合
l = -> (x,y){p x,y}
l.call("hoge", "fuga")
=>
"hoge"
"fuga"