En este código, puedo crear una matriz de cadenas "1" a "10000":Equivalente a Ruby Enumerable.collect que devuelve un Enumerable?
array_of_strings = (1..10000).collect {|i| String(i)}
¿La API de Ruby Core proporciona una forma de obtener un objeto enumerable que me permite enumerar sobre la misma lista, generando los valores de cadena a pedido, en lugar de generar una matriz de cadenas?
Aquí está un ejemplo adicional que se espera aclara lo que estoy tratando de hacer:
def find_me_an_awesome_username
awesome_names = (1..1000000).xform {|i| "hacker_" + String(i) }
awesome_names.find {|n| not stackoverflow.userexists(n) }
end
Dónde xform
es el método que yo estoy buscando. awesome_names es un enumerable, por lo que xform
no crea una matriz de cadenas de elementos de un millón de unidades, sino que genera y devuelve cadenas de la forma "hacker_ [N]" a petición.
Por cierto, esto es lo que podría ser como en C#:
var awesomeNames = from i in Range(1, 1000000) select "hacker_" + i;
var name = awesomeNames.First((n) => !stackoverflow.UserExists(n));
(una solución)
Aquí es una extensión al enumerador que añade un método xform. Devuelve otro enumerador que itera sobre los valores del enumerador original, con una transformación aplicada.
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}
... hay que leer '2 a 20' – mackenir