ブロック付きメソッドについて簡単にまとめます。
この記事では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 <=> b
は a < b
の時に-1
、a == b
の時に0
, a > b
の時に1
を返します。
sortの場合には、a <=> b
の値が1
の時に交換が行われます。
その仕組みを紐解いていきます。
ブロック付きメソッドの仕組み
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