Cette question n'est pas sur la façon d'utiliser les énumérateurs dans Ruby 1.9.1 mais plutôt je suis curieux de savoir comment ils fonctionnent. Voici un code:Comment les énumérateurs fonctionnent-ils dans 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
Dans le code ci-dessus je peux utiliser e = Bunk.new.each
, puis e.next
, e.next
pour obtenir chaque élément successif, mais comment exactement il suspendait l'exécution, puis reprendre au bon endroit?
Je suis conscient que si le rendement dans le 0.upto
est remplacé par Fiber.yield
alors il est facile à comprendre, mais ce n'est pas le cas ici. C'est un vieux yield
, alors comment ça marche?
J'ai regardé enumerator.c mais il est hype incompréhensible pour moi. Peut-être que quelqu'un pourrait fournir une implémentation dans Ruby, en utilisant des fibres, et non pas des énumérateurs basés sur la continuité de style 1.8.6, cela rend tout cela clair?
merci pour votre réponse. oui je demande beaucoup de détails à ce sujet. Plus précisément, j'aimerais savoir s'il est possible de tout mettre en œuvre dans Ruby ou s'il y a quelque chose de sournois dans C qui n'est pas possible dans Ruby. S'il est possible de l'implémenter purement en Ruby, j'aimerais voir le code! :) – horseyguy