В основном, если текущему методу был задан кодовый блок (вызывающий объект при его вызове), yield
выполняет кодовый блок, передавая указанные параметры.
[1,2,3,4,5].each { |x| puts x }
Теперь { |x| puts x}
- это кодовый блок (x
- это параметр), передаваемый каждому методу Array
. Реализация Array#each
будет перебирать себя и вызывать ваш блок несколько раз с x = each_element
pseudocode
def each
#iterate over yourself
yield( current_element )
end
Отсюда и получается
1
2
3
4
5
*block_args
- это способ Ruby принять неизвестное количество параметров в виде массива. Вызывающая сторона может передавать блоки с разным количеством аргументов.
Наконец, давайте посмотрим, что делает доходность в блоке.
class MyClass
def print_table(array, &block)
array.each{|x| yield x}
end
end
MyClass.new.print_table( [1,2,3,4,5] ) { |array_element|
10.times{|i| puts "#{i} x #{array_element} = #{i*array_element}" }
puts "-----END OF TABLE----"
}
Здесь Array#each
возвращает каждый элемент в блок, заданный для MyClass#print_table
...