Я просто хочу особо отметить цикл for in в Ruby. Может показаться, что эта конструкция похожа на другие языки, но на самом деле это выражение, похожее на любую другую циклическую конструкцию в Ruby. Фактически, for работает с объектами Enumerable так же, как и каждый итератор.
Коллекция, передаваемая для in, может быть любым объектом, у которого есть метод каждого итератора. Массивы и хэши определяют каждый метод, также как и многие другие объекты Ruby. Цикл for / in вызывает каждый метод указанного объекта. Поскольку этот итератор выдает значения, цикл for присваивает каждое значение (или каждый набор значений) указанной переменной (или переменным) и затем выполняет код в теле.
Это глупый пример, но он иллюстрирует тот факт, что цикл for in работает с ЛЮБЫМ объектом, который имеет каждый метод, так же, как и каждый итератор:
class Apple
TYPES = %w(red green yellow)
def each
yield TYPES.pop until TYPES.empty?
end
end
a = Apple.new
for i in a do
puts i
end
yellow
green
red
=> nil
А теперь каждый итератор:
a = Apple.new
a.each do |i|
puts i
end
yellow
green
red
=> nil
Как вы можете видеть, оба отвечают на каждый метод, который возвращает значения обратно в блок. Как все здесь заявили, определенно предпочтительнее использовать каждый итератор, чем цикл in. Я просто хотел показать, что в цикле for нет ничего волшебного. Это выражение, которое вызывает каждый метод коллекции, а затем передает его в свой блок кода. Следовательно, это очень редкий случай, который вам нужно использовать для in. Используйте каждый итератор почти всегда (с дополнительным преимуществом области видимости блока).