gpt4 book ai didi

ruby - 将几个 Enumerables 变成一个

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:13 24 4
gpt4 key购买 nike

有没有办法让多个 Enumerable 对象显示为单个 Enumerable 而无需将其展平为数组?目前我已经写了一个这样的类,但我觉得必须有一个内置的解决方案。

class Enumerables
include Enumerable

def initialize
@enums = []
end

def <<(enum)
@enums << enum
end

def each(&block)
if block_given?
@enums.each { |enum|
puts "Enumerating #{enum}"
enum.each(&block)
}
else
to_enum(:each)
end
end
end

enums = Enumerables.new
enums << 1.upto(3)
enums << 5.upto(8)
enums.each { |s| puts s }

作为一个简单的例子,它需要能够像这样接受无限枚举器。

inf = Enumerator.new { |y| a = 1; loop { y << a; a +=1 } };

最佳答案

好吧,这可以通过使用 Enumerator 的标准库来完成.这种方法的优点是它返回可能被映射、减少等的真实枚举数。

MULTI_ENUM = lambda do |*input|
# dup is needed here to prevent
# a mutation of inputs when given
# as a splatted param
# (due to `input.shift` below)
input = input.dup.map(&:to_enum)
Enumerator.new do |yielder|
loop do
# check if the `next` is presented
# and mutate the input swiping out
# the first (already iterated) elem
input.first.peek rescue input.shift
# stop iteration if there is no input left
raise StopIteration if input.empty?
# extract the next element from
# the currently iterated enum and
# append it to our new Enumerator
yielder << input.first.next
end
end
end

MULTI_ENUM.(1..3, 4.upto(5), [6, 7]).
map { |e| e ** 2 }

#⇒ [1, 4, 9, 16, 25, 36, 49]

关于ruby - 将几个 Enumerables 变成一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52125039/

24 4 0