Я просто хочу зробити конкретний пункт про цикл for in в Ruby. Це може здатися конструкцією, подібною до інших мов, але насправді це вираз, як і будь-який інший циклічний конструкт у Ruby. Насправді, в роботі працює з безліччю об'єктів так само, як кожен ітератор.
Колекція, передана в, може бути будь-яким об'єктом, який має метод кожного ітератора. Масиви та хеші визначають кожен метод, як і багато інших об’єктів Ruby. Цикл "в / в" викликає кожен метод зазначеного об'єкта. Оскільки цей ітератор дає значення, цикл 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
Як бачимо, обидва реагують на кожен метод, який повертає значення до блоку. Як усі тут заявили, безумовно, бажано використовувати кожен ітератор над циклом for in. Я просто хотів загнати додому, що немає нічого магічного в циклі "for in". Це вираз, який викликає кожен метод колекції, а потім передає його своєму блоку коду. Отже, це дуже рідкісний випадок, який вам потрібно буде використовувати для. Використовуйте кожен ітератор майже завжди (з додатковою перевагою блокової області).