【问题标题】:Why does this enumerator.to_a returns []?为什么这个 enumerator.to_a 返回 []?
【发布时间】:2012-12-03 09:14:47
【问题描述】:

刚好遇到这段代码

Enumerator.new((1..100), :take, 5).to_a
# => []

有谁知道为什么它返回一个空数组而不是 5 个整数的数组?

【问题讨论】:

    标签: ruby ruby-1.9


    【解决方案1】:

    来自文档,Enumerator#new

    new(obj, method = :each, *args)
    

    在不推荐使用的第二种形式中,生成的 Enumerator 迭代 使用给定方法和给定参数的给定对象 通过了。

    不鼓励使用此表格。使用 Kernel#enum_for 或 Kernel#to_enum 而是。

    第二种用法(根据文档您不应该使用),需要一个类似each 的方法(就是这样,产生值的方法)。 take 返回个值,但不yield它们,所以你得到一个空的枚举。

    请注意,在 Ruby 2 中,执行惰性 take 将非常简单:

    2.0.0dev> xs = (1..100).lazy.take(5)
    #=> #<Enumerator::Lazy: #<Enumerator::Lazy: 1..100>:take(5)>
    2.0.0dev> xs.to_a
    #=> [1, 2, 3, 4, 5] 
    

    【讨论】:

    • “所以你得到一个空的枚举。” 但是为什么我得到Enumerator.new((1..100), :take, 5).each(&amp;method(:puts)); #=&gt; [1, 2, 3, 4, 5]
    • 好问题,但实际上它与调用方法puts 无关,对each 使用空块会产生相同的输出。我不知道为什么会这样。
    猜你喜欢
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2016-03-21
    • 2018-09-02
    相关资源
    最近更新 更多