Oryginalny komentarz
W Rubim oczywiście istnieją zaawansowane możliwości tworzenia i manipulowania iteratorami oraz blokami. Niżej wklejam na szybko napisany kod, który na przemian, cyklicznie wywołuje bloki kodu, które po każdym wywołaniu potrafią kontynuować swoje działanie (zachowują wartości swoich zmiennych).
class Cycle
def initialize(enum)
@collection = enum.to_a
@len = @collection.length
@current = 0
end
def current
@collection[@current]
end
def next
@current += 1
if @current >= @len
@current = 0
end
@collection[@current]
end
def each
loop do
yield self.current
self.next
end
end
end
def Cycle(arr)
Cycle.new(arr.to_a)
end
def proc1
a, b = 1, 1
proc do
puts "proc1: #{a}"
a, b = b, a + b
end
end
def proc2
a = 2
proc do
puts "proc2: #{a}"
a *= 2
end
end
def proc3
proc do
puts "proc3"
end
end
for active_proc in Cycle([proc1, proc2, proc3]) do
active_proc.call
end
Nie znalazłem w dokumentacji Rubiego metod, które pozwalają na tworzenie cyklów z jakiejś kolekcji, więc napisałem na szybko swoją implementację. Zdaję sobie sprawę, że pod wieloma względami jest ułomna i nieelastyczna, ale tu chodzi o szybki przykład pokazujący, że taka możliwość istnieje także w Rubim. ;-)
PS. Czuję się sprowokowany i biorę się za pisanie tutoriala o blokach, procach itp. :P
Zmodyfikowany komentarz
W Rubim oczywiście istnieją zaawansowane możliwości tworzenia i manipulowania iteratorami oraz blokami. Niżej wklejam na szybko napisany kod, który na przemian, cyklicznie wywołuje bloki kodu, które po każdym wywołaniu potrafią kontynuować swoje działanie (zachowują wartości swoich zmiennych).
class Cycle
def initialize(enum)
@collection = enum.to_a
@len = @collection.length
@current = 0
end
def current
@collection[@current]
end
def next
@current += 1
if @current >= @len
@current = 0
end
@collection[@current]
end
def each
loop do
yield self.current
self.next
end
end
end
def Cycle(arr)
Cycle.new(arr.to_a)
end
def proc1
a, b = 1, 1
proc do
puts "proc1: #{a}"
a, b = b, a + b
end
end
def proc2
a = 2
proc do
puts "proc2: #{a}"
a *= 2
end
end
def proc3
proc do
puts "proc3"
end
end
for active_proc in Cycle([proc1, proc2, proc3]) do
active_proc.call
end
Nie znalazłem w dokumentacji Rubiego metod, które pozwalają na tworzenie cyklów z jakiejś kolekcji, więc napisałem na szybko swoją implementację. Zdaję sobie sprawę, że pod wieloma względami jest ułomna i nieelastyczna, ale tu chodzi o szybki przykład pokazujący, że taka możliwość istnieje także w Rubim. ;-)
PS. Czuję się sprowokowany i biorę się za pisanie tutoriala o blokach, procach itp. :P