Jogger.pl


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