Chcę tylko zwrócić uwagę na pętlę for in w Ruby. Może wydawać się konstrukcją podobną do innych języków, ale w rzeczywistości jest to wyrażenie jak każda inna konstrukcja pętli w Rubim. W rzeczywistości for in działa z obiektami policzalnymi tak jak każdy iterator.
Kolekcja przekazywana do w może być dowolnym obiektem, który ma metodę każdego iteratora. Tablice i skróty definiują każdą metodę, podobnie jak wiele innych obiektów Ruby. Pętla for / in wywołuje każdą metodę określonego obiektu. Ponieważ iterator zwraca wartości, pętla for przypisuje każdą wartość (lub każdy zestaw wartości) do określonej zmiennej (lub zmiennych), a następnie wykonuje kod w treści.
To głupi przykład, ale ilustruje to, że pętla for in działa z KAŻDYM obiektem, który ma każdą metodę, podobnie jak robi to każdy iterator:
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 teraz każdy iterator:
a = Apple.new
a.each do |i|
puts i
end
yellow
green
red
=> nil
Jak widać, oba reagują na każdą metodę, która zwraca wartości z powrotem do bloku. Jak wszyscy tutaj stwierdzili, zdecydowanie lepiej jest używać każdego iteratora niż w pętli for. Chciałem po prostu jechać do domu do tego stopnia, że w pętli for in nie ma nic magicznego. Jest to wyrażenie, które wywołuje każdą metodę kolekcji, a następnie przekazuje ją do swojego bloku kodu. W związku z tym jest to bardzo rzadki przypadek, w którym należałoby użyć w. Używaj każdego iteratora prawie zawsze (z dodatkową zaletą zakresu bloków).