メソッド内で yield
を呼び出すと、そのメソッドを呼び出すときに与えられたコードブロック({...}
で囲まれたコード)をその位置で実行することができます。
下記の例では、puts 'Hello'
を実行するコードブロックを関数に渡しています。
def hoge
yield
yield
end
hoge { puts 'Hello' }
Hello
Hello
yield
をパラメータを付けて実行すると、そのパラメータがコードブロックに渡されます。
def hoge
yield 100, 200
yield 200, 300
end
hoge { |x, y| puts(x + y) }
300
500
コードブロックは、{...}
の形式でなく、do ... end
の形式で記述する事もできます。
コードブロックが複数行に渡る場合は、do ... end
の形式を使う事が多いようです。
hoge do |x, y|
puts(x + y)
end
データのリストを保持するクラスなどは、each
メソッドが定義されている事が多く、
このメソッドは各データを 1 つずつ処理するための each イテレータ として働きます。
class MyList
def each
[100, 200, 300].each do |x|
yield x
end
end
end
myList = MyList.new
myList.each { |x| puts(x) }
100
200
300