Подтвердить что ты не робот

Рубин: разница между @cars.each do | автомобиль | и для автомобиля в @cars do

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

@cars.each do |car| 

и

for car in @cars do

?

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

4b9b3361

Ответ 1

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

для/in - в основном просто синтаксический сахар для #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"

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

Лично я никогда не использую ruby ​​для синтаксиса/in.

Ответ 2

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

Примечание. Вы можете потерять "сделать" на втором.