このコードでは、文字列「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は列挙可能であるためxform
、文字列の100万要素の配列を作成するのではなく、オンデマンドで「hacker_[N]」形式の文字列を生成して返すだけです。
ちなみに、C#では次のようになります。
var awesomeNames = from i in Range(1, 1000000) select "hacker_" + i;
var name = awesomeNames.First((n) => !stackoverflow.UserExists(n));
(1つの解決策)
これは、xformメソッドを追加するEnumeratorの拡張機能です。変換が適用された、元の列挙子の値を反復処理する別の列挙子を返します。
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}