LoginSignup
55
61

More than 5 years have passed since last update.

Ruby の yield, Proc, lambda

Last updated at Posted at 2014-10-22

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"

55
61
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
61