在這段代碼中,我創建的字符串「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