将枚举器转换为惰性枚举器

时间:2016-05-19 09:23:13

标签: ruby

可以使用Enumerator::Lazy.new这样的枚举器转换为惰性枚举器(这是一个示例;在开始时,我已经有一个枚举器,而不是一个数组):

xs_enum = [1, 2, 3].to_enum
# => #<Enumerator: [1, 2, 3]:each>
xs_lazy_enum = Enumerator::Lazy.new(xs_enum, &:yield)
# => #<Enumerator::Lazy: #<Enumerator: [1, 2, 3]:each>:each>
xs_lazy_enum.force
# => [1, 2, 3]

有更简洁的方法吗?

2 个答案:

答案 0 :(得分:8)

您可以直接在阵列(或枚举器)上调用lazy

[1, 2, 3].lazy
# => #<Enumerator::Lazy: [1, 2, 3]>

答案 1 :(得分:4)

怎么样:

[1, 2, 3].to_enum.lazy
# => #<Enumerator::Lazy: ...>
  

确实,但问题是我从枚举器开始,而不是从数组

开始

这并没有改变任何事情:

enum = (1..10).each
# => #<Enumerator: ...>
enum.lazy
# => #<Enumerator::Lazy: ...>

Enumerable#to_enum返回一个枚举器。如果您将呼叫链接到Enumerable#lazy,则第二条消息的接收方是第一次呼叫返回的枚举器。