Ошибка Ruby для цикла с {} разделителем блоков
В языке Ruby в irb
работает следующее:
for fruit in ['apple', 'banana', 'cherry', 'date'] do
puts fruit
end
но это не
# error
for fruit in ['apple', 'banana', 'cherry', 'date'] { puts fruit }
Обратите внимание, что следующие разделители блоков не являются ошибками
5.times do |i|
puts "hello "+i.to_s
end
5.times { |i| puts "hello "+i.to_s }
Изменить: я предполагаю, что я наблюдаю, это несогласованность с тем, как закончить замену на {} может кто-нибудь объяснить, почему или, пожалуйста, указать на мою ошибку?
Ответы
Ответ 1
В следующей цитате из this сообщение объясняет "несогласованность" хорошо (внимание мое):
end
- это ключевое слово generic, которое заканчивает контекст (условные обозначения, определения классов и модулей, определения методов, циклы и исключение-catch [statements]). Curly braces - специальный синтаксис для определения блоков или хэшей.
Циклы for
- это структуры управления, а не методы с блочным аргументом, поэтому они должны быть закрыты с помощью ключевого слова end
. Методы, такие как Enumerable#times
и Enumerable#each
, имеют блок-аргумент, который можно определить с помощью синтаксиса { }
или do ... end
.
Ответ 2
for
не является методом, определенным для Object или в Kernel, и он не ожидает блока.
Вы не можете написать:
class A {
def method {
}
}
либо.
Вы можете определить собственный метод my_for
:
module Kernel
def my_for(elements, &block)
elements.each(&block)
end
end
my_for ['apple','banana','cherry', 'date'] do |fruit|
puts fruit
end
my_for ['apple','banana','cherry', 'date'] { |fruit| puts fruit }