在这段代码中,我创建了一个字符串数组“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
不是创建一个包含 100 万个元素的字符串数组,而是根据需要生成并返回“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}