Ошибка 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 }