Questa domanda non riguarda l'uso degli Enumeratori in Ruby 1.9.1, ma piuttosto sono curioso di sapere come funzionano. Ecco il codice:Come funzionano gli enumeratori in Ruby 1.9.1?
class Bunk
def initialize
@h = [*1..100]
end
def each
if !block_given?
enum_for(:each)
else
0.upto(@h.length) { |i|
yield @h[i]
}
end
end
end
Nel codice di cui sopra posso usare e = Bunk.new.each
, e poi e.next
, e.next
per ottenere ogni elemento successivo, ma esattamente come è vero sospendendo l'esecuzione e poi riprendere al punto giusto?
Sono consapevole che se il rendimento nel 0.upto
viene sostituito con Fiber.yield
, allora è facile da capire, ma non è questo il caso. È un semplice vecchio yield
, quindi come funziona?
Ho guardato enumerator.c ma è quasi impossibile per me. Forse qualcuno potrebbe fornire un'implementazione in Ruby, usando le fibre, non gli enumeratori basati sulla continuazione dello stile 1.8.6, che rende tutto chiaro?
grazie per la risposta. sì, sto chiedendo un sacco di dettagli su questo. in particolare vorrei sapere se è possibile implementarlo tutto in Ruby o se c'è qualcosa di subdolo in C che non è possibile in Ruby. Se è possibile implementarlo esclusivamente in Ruby, mi piacerebbe vedere il codice! :) – horseyguy