今回はRubyのyieldついて学習していくよ!
こんな方におすすめ
- Rubyを学習している人
- yield理解したい人
現場でRubyを使って開発しているので、個人の勉強記録として残します。
「yield」とは?
自分で定義したブロック付きメソッドでブロックを呼び出すときに使います。 yield に渡された値はブロック記法において | と | の間にはさまれた変数(ブロックパラメータ)に代入されます。
簡単に言うと、yield
は、メソッドの中でブロック(do ... end
や { ... }
で囲まれた処理)を実行するための特別なキーワードになります。
また、yield
に値を渡すと、その値はブロックの中で |
と |
の間に書いた変数(ブロックパラメータ)に入ります。
言葉ではイメージしにくいので実際にコードを見ていきます。
# ブロック付きメソッドの定義
def foo
yield(1,2)
end
# fooに「2引数手続き、その働きは引数を配列に括ってpで印字する」というものを渡して実行させる
foo {|a,b|
p [a, b]
} # => [1, 2] (要するに p [1, 2] を実行した)
step
1foo
メソッドの定義
# ブロック付きメソッドの定義
def foo
yield(1,2)
end
foo
メソッドは、ブロックを受け取るメソッドになっている。yield(1, 2)
によって、渡されたブロックに1
と2
を渡す。
step
2foo
メソッドの呼び出し
foo { |a, b| p [a, b] }
foo
を呼び出すとき、{ |a, b| p [a, b] }
というブロックを渡す。- ここで
|a, b|
は ブロックの引数 となる。
step
3yield(1, 2)
により、ブロックが実行される
yield(1, 2)
の部分が実行されると、ブロック{ |a, b| p [a, b] }
が実行される。yield(1, 2)
の1
はa
に、2
はb
に代入される。
step
4p [1, 2]
が実行される
p
は配列[1, 2]
を出力する。- そのため、結果として
[1, 2]
が表示される。
どんなときに「yield」は使えるのか?
yield
は、共通処理のカスタマイズ に役立ちます。
特に、メソッドの前後に共通の処理を入れたい場合 に便利です。
例:処理の開始と終了を記録し、実行時間を測定する
measure_time
メソッドでは、処理の実行時間を測る仕組みを共通化できます。
def measure_time
start_time = Time.now
yield
end_time = Time.now
puts "処理時間: #{end_time - start_time} 秒"
end
measure_time do
sleep(2) # 2秒間の処理をシミュレーション
puts "データ処理完了"
end
◎結果
データ処理完了
処理時間: 2.0 秒
このように、measure_timeメソッドを呼び出したときに、渡すブロックによって内容が変わるので、処理時間を測定するというメソッドを共通化することができます。
おわりに
今回はyieldについて学習してみました。
少しでも学習のお役に立てれば幸いです。