More than 1 year has passed since last update.

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"

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.