【发布时间】:2018-05-14 16:31:58
【问题描述】:
我们有一个 Enumerator::Lazy 对象
a = [1,2,3].lazy.map {} #=> <Enumerator::Lazy: #<Enumerator::Lazy: [1, 2, 3]>:map>
a.size #=> 3
a.clone.size #=> nil
有人对这种行为有正确的解释吗?我知道size 返回枚举器的大小,如果不能懒惰地计算,则返回 nil。
当我们克隆对象时,它会返回
a.clone #=> <Enumerator::Lazy:<Enumerator::Generator:0x00007fdaa80218d8>:each>
【问题讨论】:
-
我不完全确定这里发生了什么,但我敢猜测这与
Object#clone执行的浅 副本有关。我认为甚至可能在惰性枚举器上执行深层复制(通常),并且正是枚举器的这种嵌套导致了异常行为。 -
也许这应该被认为是 ruby 中的一个(晦涩的)错误;我不知道。也许在bugs.ruby-lang.org 上提出这个问题,看看他们对此有何看法?
-
似乎在最近的版本中引入了它,在 2.3.1 中按预期工作
-
读者:如果不明显,“我知道 size 返回枚举数的大小,如果不能懒惰地计算,则返回 nil。”来自Enumerator#size 的文档。
-
有一个相关的线程here,可能会感兴趣。