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
не делает.
Лично я никогда не использую рубин для / в синтаксисе.
Я думаю, что это просто синтаксический сахар. Это функционально эквивалентно, и мне не известно о каких-либо различиях в реализации интерпретатора.
Обратите внимание - вы можете потерять "делать" на втором.