1
1

More than 5 years have passed since last update.

【Ruby】ブロック付きメソッドについて

Last updated at Posted at 2018-11-21

ブロック付きメソッドについて簡単にまとめます。

この記事ではMacOSにインストールした Ruby 2.5.1を使っています。

ブロック付きメソッドの例 - sortメソッド

sort メソッドを使うことで、ブロック内に記述した条件でArrayオブジェクトにソートを適用することができます。

test.rb
[3,1,10,7,9,2].sort{ |a,b|
  b <=> a
}
# [10, 9, 7, 3, 2, 1]

上記のコードだと、降順にソートすることができます。
ブロック内で最後に評価された値がメソッドに渡されます。
<=> は演算子で、a <=> ba < b の時に-1a == bの時に0, a > b の時にを返します。
sortの場合には、a <=> bの値がの時に交換が行われます。
その仕組みを紐解いていきます。

ブロック付きメソッドの仕組み

yield

yieldを使うとブロックの変数に値を渡すことができ、ブロック内で最後に評価された値が返されます。

test2.rb
def hoge(x,y)
  yield(x,y)
end

hoge(2,4){ |i,j|
  i + j
}
# 6

しかし、以下のように関数fooから関数hogeを呼び出すことはできない

test3.rb

def hoge(x,y)
  yield(x,y)
end

def foo(x,y)
  hoge(x,y)
end

foo(2,4){ |i,j|
  i + j
}
# エラー 

ブロック引数

test3.rbで発生したエラーを解決するために、ブロック引数が用意されています。
ブロック引数は&を接頭して宣言します。
ブロック引数には、ブロックが定義されていない時にはnilが入り、手続きが定義されている時には、メソッドcallを用いてyieldと同様に呼び出せます。

test4.rb
def foo(x,y,&b)
  hoge(x,y,b)
end

def hoge(x,y,b)
  if b == nil
    nil
  else
    b.call(x,y)
  end
end

foo(2,4){ |i,j|
  i + j
}
# 6
1
1
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
1
1