Rubyのyieldの真髄:柔軟なブロック処理をデザインする
- 作成日 2025.01.30
- その他

Rubyのyield
は、メソッド内でブロックを実行するための強力な仕組みです。本記事では、yield
の基本的な使い方から応用までを網羅し、柔軟なブロック処理を実現する方法を学びます。
目次
yieldとは何か
yield
は、メソッド内で与えられたブロックを呼び出すキーワードです。
def greet
yield
end
greet { puts "こんにちは!" }
引数を伴うyield
yield
は、引数を渡すことが可能です。
def greet(name)
yield(name)
end
greet("太郎") { |name| puts "こんにちは、#{name}さん!" }
ブロックが渡されたかを確認する
block_given?
メソッドを使用して、ブロックが渡されているか確認できます。
def greet
if block_given?
yield
else
puts "ブロックがありません。"
end
end
greet
greet { puts "こんにちは!" }
複数のyield
メソッド内で複数回yield
を使用することができます。
def repeat
3.times { yield }
end
repeat { puts "繰り返し処理" }
デフォルトのブロック処理
ブロックが渡されない場合のデフォルト処理を定義することが可能です。
def greet
if block_given?
yield
else
puts "こんにちは、デフォルトの挨拶です!"
end
end
greet
greet { puts "カスタムの挨拶!" }
ネストされたブロック
ブロックの中でさらにブロックを呼び出すことができます。
def outer
yield
end
outer do
puts "外側の処理"
3.times { |i| puts "内側の処理 #{i + 1}" }
end
yieldを使ったリソース管理
リソースの確実な解放をyield
で管理できます。
def with_file(filename)
file = File.open(filename, "w")
yield(file)
ensure
file.close
end
with_file("example.txt") do |file|
file.puts "データを書き込む"
end
yieldと戻り値
yield
の戻り値を利用することも可能です。
def calculate
result = yield(2, 3)
puts "計算結果: #{result}"
end
yieldとenumerator
yield
を使ってカスタムEnumerator
を作成する方法です。
def custom_enumerator
return enum_for(:custom_enumerator) unless block_given?
3.times { |i| yield(i) }
end
custom_enumerator.each { |num| puts num }
yieldの無名ブロック化
ブロックを明示的に無名関数として受け取る代わりにyield
を使用します。
def greet(&block)
block.call if block
end
greet { puts "無名ブロックの呼び出し" }
yieldのパフォーマンス
yield
のパフォーマンスは高く、ブロックを直接扱うよりも効率的です。
require 'benchmark'
def with_yield
yield
end
def with_block(&block)
block.call
end
Benchmark.bm do |x|
x.report("yield:") { 100000.times { with_yield { "処理" } } }
x.report("block:") { 100000.times { with_block { "処理" } } }
end
yieldの応用例:DSL設計
yield
を利用してシンプルなDSLを構築する方法です。
class DSL
def self.build(&block)
dsl = new
dsl.instance_eval(&block)
end
def say(message)
puts message
end
end
DSL.build do
say "こんにちは!"
say "DSLの例です。"
end
まとめ
Rubyのyield
を活用することで、柔軟でパワフルなブロック処理を設計できます。シンプルなメソッド呼び出しからDSL構築まで、その用途は非常に幅広いです。
-
前の記事
kotlin 「for」文を使用する 2025.01.29
-
次の記事
Rocky LinuxでのKubernetesクラスタ構築・管理ガイド 2025.01.30
コメントを書く