В этом коде я создаю массив строк с «1» по «10000»:
array_of_strings = (1..10000).collect {|i| String(i)}
Предоставляет ли Ruby Core API способ получения перечислимого объекта, который позволяет мне перечислять по одному и тому же списку, генерируя строковые значения по требованию, а не генерируя массив строк?
Вот еще один пример, который, надеюсь, проясняет, что я пытаюсь сделать:
def find_me_an_awesome_username
awesome_names = (1..1000000).xform {|i| "hacker_" + String(i) }
awesome_names.find {|n| not stackoverflow.userexists(n) }
end
Где xform
- метод, который я ищу.
awesome_names является Enumerable, поэтому xform
не создает массив строк из 1 миллиона элементов, а просто генерирует и возвращает строки вида "hacker_ [N]" по требованию.
Кстати, вот как это может выглядеть в C #:
var awesomeNames = from i in Range(1, 1000000) select "hacker_" + i;
var name = awesomeNames.First((n) => !stackoverflow.UserExists(n));
(одно решение)
Вот расширение Enumerator, которое добавляет метод xform. Он возвращает другой перечислитель, который перебирает значения исходного перечислителя с примененным к нему преобразованием.
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}