Какой смысл “для x в y” в Ruby?

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

<% for post in @posts %>

в руководстве направляющих. Я понял, что идиоматический способ сделать это в Ruby с:

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

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

Править: Я только что нашел два конфликтующих объяснения этого: Учебная Точка говорит, что они - то же кроме "для цикла, не создает новый объем для локальных переменных", тогда как 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 использовался в направляющих 2.2.2, но 2.3.8 это использует y.each do |x|. Именно так Вы знаете.

13
задан Skilldrick 28 July 2010 в 20:50
поделиться

5 ответов

Страница обучающих точек верна, для эквивалентно каждому , за исключением разницы в области видимости. Вот демонстрация:

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

vs.

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

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

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

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

21
ответ дан 1 December 2019 в 22:38
поделиться

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

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

0
ответ дан 1 December 2019 в 22:38
поделиться

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

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

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

0
ответ дан 1 December 2019 в 22:38
поделиться

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

0
ответ дан 1 December 2019 в 22:38
поделиться

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

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

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

0
ответ дан 1 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: