Ruby: разница между @cars.each do |car| и для машины в @cars сделать

(Извините за вопрос новичка.) В Ruby, в чем разница между циклами:

@cars.each do |car| 

а также

for car in @cars do

?

есть ли разница в эффективности, или зачем нам два (или более) способа выразить одно и то же? Второй способ кажется мне более элегантным / естественным, но я могу упустить некоторые важные замечания, почему первый может быть лучшим выбором.

2 ответа

Решение

Больше людей используют @cars.each нотация, потому что это обобщает на другие методы (например, #inject, #each_with_index, #mapи т. д., а также обратные вызовы без итераторов).

для / в это в основном просто синтаксический сахар для #each, Основное различие в том, как эти две работы находятся в переменной области видимости:

irb> @cars = %w{ ford chevy honda toyota }
#=> ["ford", "chevy", "honda", "toyota"]
irb> @cars.each { |car| puts car }
ford
chevy
honda
toyota
#=> ["ford", "chevy", "honda", "toyota"]
irb> car
NameError: undefined local variable or method `car` for #<Object:0x399770 @cars=["ford", "chevy", "honda", "toyota"]>
        from (irb):3
        from /usr/local/bin/irb:12:in `<main>`
irb> for car in @cars
     puts car.reverse
     end
drof
yvehc
adnoh
atoyot
#=> ["ford", "chevy", "honda", "toyota"]
irb> car
#=> "toyota"

for / in впоследствии оставляет переменную итератора в области видимости, а #each не делает.

Лично я никогда не использую рубин для / в синтаксисе.

Я думаю, что это просто синтаксический сахар. Это функционально эквивалентно, и мне не известно о каких-либо различиях в реализации интерпретатора.

Обратите внимание - вы можете потерять "делать" на втором.

Другие вопросы по тегам