Скобки определяют анонимную функцию, называемую блоком. Токены между каналом являются аргументами этого блока. Количество требуемых аргументов зависит от того, как используется блок. Каждый раз, когда блок оценивается, метод, требующий этого блока, будет передавать значение на основе вызывающего его объекта.
Это то же самое, что и определение метода, только оно не сохраняется за пределами метода, который принимает блок.
Например:
def my_print(i)
puts i
end
будет выполнять то же самое при выполнении:
{|i| puts i}
единственное отличие состоит в том, что блок определяется на лету и не сохраняется.
Пример 2:
Следующие утверждения эквивалентны
25.times &method(:my_print)
25.times {|i| puts i}
Мы используем анонимные блоки, потому что большинство функций, переданных как блок, обычно специфичны для вашей ситуации и не требуют определения для повторного использования.
Так что же происходит, когда метод принимает блок? Это зависит от метода. Методы, которые принимают блок, будут вызывать его, передавая значения из вызывающего объекта четко определенным образом. То, что возвращается, зависит от метода, требующего блока.
Например: In 25.times {|i| puts i}
.times вызывает блок один раз для каждого значения от 0 до значения его вызывающего, передавая значение в блок как временную переменную i. Times возвращает значение вызывающего объекта. В этом случае 25.
Давайте рассмотрим метод, который принимает блок с двумя аргументами.
{:key1 => "value1", :key2 => "value2"}.each {|key,value|
puts "This key is: #{key}. Its value is #{value}"
}
В этом случае каждый вызывает блочные единицы для каждой пары ключ / значение, передавая ключ в качестве первого аргумента и значение в качестве второго аргумента.