【问题标题】:Convert enumerator to lazy enumerator将枚举数转换为惰性枚举数
【发布时间】:2016-05-19 17:36:49
【问题描述】:

可以像这样使用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]

还有更简洁的方法吗?

【问题讨论】:

    标签: ruby


    【解决方案1】:

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

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

    【讨论】:

    • 漂亮简单的答案!
    【解决方案2】:

    怎么样:

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

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

    这不会改变任何事情:

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

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

    【讨论】:

    • 谢谢,这里有一些微妙之处,你的 sn-p 和我的输出略有不同:=&gt; #&lt;Enumerator::Lazy: #&lt;Enumerator: [1, 2, 3]:each&gt;&gt; vs #&lt;Enumerator::Lazy: #&lt;Enumerator: [1, 2, 3]:each&gt;:each&gt;。我将更改问题中的示例。
    • 你是对的!最后,当使用枚举器时,这种差异无关紧要,所以一个简单的enum.lazy 是要走的路。
    • 很好地回答了一个有趣的问题。为什么不直接从enum = (1..10).each 开始回答。
    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 2019-03-04
    • 1970-01-01
    • 2020-08-21
    • 2021-01-04
    • 2010-10-11
    相关资源
    最近更新 更多