gpt4 book ai didi

ruby - 返回 Enumerable 的 Ruby Enumerable.collect 的等价物?

转载 作者:数据小太阳 更新时间:2023-10-29 06:54:04 28 4
gpt4 key购买 nike

在这段代码中,我创建了一个字符串数组“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}

最佳答案

引入了 Ruby 2.0 Enumerable#lazy它允许链接 mapselect 等...,并且只在最后用 to_a 生成最终结果first 等...您可以在任何带有 require 'backports/2.0.0/enumerable/lazy' 的 Ruby 版本中使用它。

require 'backports/2.0.0/enumerable/lazy'
names = (1..Float::INFINITY).lazy.map{|i| "hacker_" + String(i) }
names.first # => 'hacker_1'

否则,您可以使用 Enumerator.new { with_a_block }。它是 Ruby 1.9 中的新功能,因此如果您在 Ruby 1.8.x 中需要它,需要 'backports/1.9.1/enumerator/new'

根据您的示例,以下不会创建中间数组,只会构造所需的字符串:

require 'backports/1.9.1/enumerator/new'

def find_me_an_awesome_username
awesome_names = Enumerator.new do |y|
(1..1000000).each {|i| y.yield "hacker_" + String(i) }
end
awesome_names.find {|n| not stackoverflow.userexists(n) }
end

如果需要,您甚至可以用 1.0/0(即无穷大)替换 100000。

要回答您的评论,如果您总是将您的值(value)观一对一映射,您可能会这样:

module Enumerable
def lazy_each
Enumerator.new do |yielder|
each do |value|
yielder.yield(yield value)
end
end
end
end

awesome_names = (1..100000).lazy_each{|i| "hacker_#{i}"}

关于ruby - 返回 Enumerable 的 Ruby Enumerable.collect 的等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2327780/

28 4 0