【Ruby初心者向け】yieldとProcの違いを自分なりに整理してみた
こんにちは!Rubyを勉強中の初学者です。
勉強していて「yield?Proc?何が違うの?」と混乱したので、
自分自身の理解を深めるためにこの記事を書いています。
同じように悩んでいる人の助けになればうれしいですし、
「ここは違うよ!」などアドバイスがあれば、ぜひコメントで教えてください🙏
1. yieldとは?
yield
(イールド)は、メソッドに渡されたブロックを呼び出すためのキーワードです。
基本的な使い方
ruby
def greet
puts "こんにちは"
yield if block_given?
puts "さようなら"
end
greet do
puts "お元気ですか?"
end
実行結果
こんにちは
お元気ですか?
さようなら
ruby
def twice
yield("朝")
yield("夜")
end
twice do |time|
puts "こんにちは、#{time}のごあいさつです!"
end
実行結果
こんにちは、朝のごあいさつです!
こんにちは、夜のごあいさつです!
2. Procとは?
Proc
(プロック)は、ブロックをオブジェクトとして変数に格納できる仕組みです。Proc.new
やproc
メソッドで作成し、あとで呼び出すことができます。
基本的な使い方
ruby
hello = Proc.new { puts "こんにちは from Proc!" }
hello.call
実行結果
こんにちは from Proc!
引数も渡せる
ruby
greet = Proc.new { |name| puts "こんにちは、#{name}さん" }
greet.call("太郎")
実行結果
こんにちは、太郎さん
何度も使えるのが特徴
ruby
repeat = Proc.new { puts "何度でも呼べるよ!" }
3.times { repeat.call }
実行結果
何度でも呼べるよ!
何度でも呼べるよ!
何度でも呼べるよ!
3. yield
とProc
の違い
比較項目 | yield |
Proc |
---|---|---|
呼び出し方 | yield |
proc.call または proc[]
|
ブロックの渡し方 | メソッドに直接ブロックを渡す |
Proc オブジェクトを引数で渡す |
オブジェクトか | ❌ オブジェクトではない | ✅ オブジェクト |
引数の定義 | 暗黙的に受け取る | 明示的に引数を定義できる |
再利用性 | 一度だけ(基本) | 何度でも呼べる |
柔軟性 | シンプルだけど柔軟性は低め | 高い柔軟性がある |
4. 実践例(使い分けイメージ)
yield
が便利なケース
ruby
def with_log
puts "処理を開始します"
yield
puts "処理が完了しました"
end
with_log do
puts "実行中の処理"
end
#実行結果
処理を開始します
実行中の処理
処理が完了しました
- 簡単な処理を、前後に挟むログ付きで実行したいときなどに便利
Proc
が便利なケース
ruby
def custom_each(array, proc)
array.each { |item| proc.call(item) }
end
printer = Proc.new { |item| puts "アイテム:#{item}" }
custom_each([1, 2, 3], printer)
#実行結果
アイテム:1
アイテム:2
アイテム:3
- 処理を変数に入れて再利用したいときに便利
5. まとめ
観点 | yield | Proc |
---|---|---|
目的 | 渡されたブロックを一度実行 | ブロックを変数として再利用 |
柔軟性 | 少し制限あり | 柔軟に組み合わせや再利用が可能 |
向いている場面 | シンプルなブロック実行 | 複数箇所で使う処理をまとめたいとき |
おわりに
自分自身もまだまだRubyを学んでいる途中なので、
もし間違いや改善点などがあれば、ぜひ優しく教えてください!
この記事が、同じように学習中の方の助けになれば幸いです。
読んでくださってありがとうございました 😊