Dans ce code, je crée un tableau de chaînes « 1 » à « 10000 »:Equivalent de Ruby Enumerable.collect qui retourne un Enumerable?
array_of_strings = (1..10000).collect {|i| String(i)}
L'API Ruby Core fournit un moyen d'obtenir un objet dénombrable qui me permet d'énumérer sur la même liste, la génération les valeurs de chaîne à la demande, plutôt que de générer un tableau des chaînes?
Voici un autre exemple qui précise, espérons-ce que je suis en train de faire:
def find_me_an_awesome_username
awesome_names = (1..1000000).xform {|i| "hacker_" + String(i) }
awesome_names.find {|n| not stackoverflow.userexists(n) }
end
Où xform
est la méthode que je cherche. awesome_names est un Enumerable, donc xform
ne crée pas un tableau de chaînes de 1 million d'éléments, mais génère et retourne simplement des chaînes de la forme "hacker_ [N]" à la demande.
D'ailleurs, voici ce qu'il pourrait ressembler en C#:
var awesomeNames = from i in Range(1, 1000000) select "hacker_" + i;
var name = awesomeNames.First((n) => !stackoverflow.UserExists(n));
(une solution)
Voici une extension recenseur qui ajoute une méthode xform. Il renvoie un autre énumérateur qui itère sur les valeurs de l'énumérateur d'origine, avec une transformation qui lui est appliquée.
class Enumerator
def xform(&block)
Enumerator.new do |yielder|
self.each do |val|
yielder.yield block.call(val)
end
end
end
end
# this prints out even numbers from 2 to 10:
(1..10).each.xform {|i| i*2}.each {|i| puts i}
... devrait lire « 2 à 20 » – mackenir