是否有一种方法可以将多个Enumerable对象显示为单个Enumerable,而无需将其展平为Array?目前,我已经编写了这样的课程,但我觉得必须有一个内置的解决方案。
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 } };
答案 0 :(得分:4)
好吧,这可以通过使用Enumerator
的标准库来完成。这种方法的优势在于它会返回 real 枚举器,该枚举器可能会被映射,缩减等。
element.innerHTML = `<%@include file="../jsp/welcome.jsp" %>`;
答案 1 :(得分:2)
毕竟。对元素使用Enumerable::Lazy#flat_map
和.each.lazy
:
inf = Enumerator.new { |y| a = 1; loop { y << a; a += 1 } }
[(1..3).to_a, inf].lazy.flat_map { |e| e.each.lazy }.take(10).force
#⇒ [1, 2, 3, 1, 2, 3, 4, 5, 6, 7]
答案 2 :(得分:0)
我最终得到了这种解决方案,也许与您已经尝试过的解决方案很接近:
def enumerate(*enum)
enum.each_with_object([]) { |e, arr| arr << e.to_a }.flatten
end
enumerate( 1..3, 5.upto(8), 3.times, 'a'..'c' ).each { |e| p e }
# => 1, 2, 3, 5, 6, 7, 8, 0, 1, 2, "a", "b", "c"
或者(相同的力学):
def enumerate(*enum)
enum.flat_map { |e| e.to_a }
end