在这段代码中,我创建的字符串“1”到“10000”的数组:等价的返回Enumerable的Ruby Enumerable.collect?
array_of_strings = (1..10000).collect {|i| String(i)}
是否Ruby的核心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));
(一体化解决方案)
这里是一个扩展枚举增加了一个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}
......应该读“2至20” – mackenir 2010-02-24 21:00:17