Какая точка "для x в y" в Ruby?

Я изучаю Ruby и RoR на данный момент, и я натолкнулся на это:

<% for post in @posts %>

в Rails guide. Я понял, что идиоматический способ сделать это в Ruby:

<% @posts.each do |post| %>

Если есть разница, то что это? И если нет никакой разницы, не лучше ли было бы, чтобы люди Rails подталкивали правильные идиомы Ruby (а не это, что выглядит мне более pythonic)?

Изменить: Я только что нашел два противоречивых объяснения этого: Tutorials Point говорит, что они одинаковы кроме "цикл for не создает новую область для локальных переменных", тогда как CS.Auckland.ac.NZ говорит, что for - это просто синтаксический сахар для эквивалент .each.

Edit2: Вопрос for ... in был для index.html.erb, сгенерированного в app/views/posts, на script/generate scaffold. Я сделал быструю проверку и теперь генерирует синтаксис .each. Я предполагаю, что часть руководства была написана на более ранней стадии развития рельсов, когда эшафот сгенерировал for ... in.

Edit3: Теперь я могу подтвердить, что for x in y использовался в Rails 2.2.2, но в 2.3.8 он использует y.each do |x|. Просто чтобы вы знали.

Ответы

Ответ 1

Правильная страница учебной точки, for эквивалентна each, за исключением разницы в области видимости. Вот демонстрация:

arr = [1,2,3]
arr.each do |x|
  last = x
end
last # NameError

против.

arr = [1,2,3]
for x in arr
  last = x
end
last #=> 3

Если вы хотите, чтобы он работал с помощью each, вам нужно сделать last = nil перед циклом. Это, как указывала ссылка, потому что блоки запускают новую область, а for нет.

Обратите внимание, что это редко делает практические различия, и немногие люди даже знают об этом.

Когда люди используют for в рубине чаще всего, потому что то, что они используют для перехода с других языков, - не из-за каких-либо различий между for и each.

Ответ 2

Дело в том, что первый пример (for post in @posts) выглядит более "процедурным", а второй (@posts.each do |post|) выглядит более "функциональным". К сожалению, процедурный способ читать код по-прежнему считается более популярным, более понятным и менее "застенчивым". Вот почему, возможно, многие предпочли бы его "родному" способу итерации через контейнеры.

Если он выглядит pythonic (я не уверен, что это правда), то его можно считать еще лучше, поскольку он улучшает доступность Rails разработчиками, которые поступают с других платформ.

Лично я хотел бы, чтобы рубины и "функциональные" способы были нажаты. Но приведенные выше причины показывают, что это можно сделать в любом случае.

Ответ 3

В какой-то день я разрабатывал функцию создания отчетов в формате PDF для веб-сайта, над которым я работал.

Плагин, который я использовал, имел множество ограничений. Эти ограничения принудили меня к созданию решения, которое было очень важным и процедурным. Я использовал конструкции типа while или for, чтобы подчеркнуть этот стиль программирования.

Фактически, это была единственная ситуация, когда я использовал эти ключевые слова в ruby.

Ответ 4

Вы можете использовать for x in y, если вы пытаетесь выполнить профилирование ruby, а ваша версия ruby-prof не имеет устранения метода.

Ответ 5

Еще одна вещь о for x in y заключается в том, что вы можете сделать for i in 1..5, который будет работать как стандарт для цикла, начиная с i = 1 и проходя через i = 5.

Полезная вещь в том, что вы можете использовать диапазон, например 3..8 или x..y, вы не застреваете, начиная с нуля, что вы бы использовали с помощью метода n.times.