没有集合的枚举器

Enumerator without collection

我有 运行 进入这个结构:

Enumerator.new(&:map)

我不知道如何使用它。

确定这是有效代码,它 returns 枚举器,但它没有任何集合可枚举。

如何将集合提供给此枚举器?

使用当前设置,您无法将任何集合传递给它。实例化后无法更改枚举器的集合。

当前代码之所以有效,是因为 is 块不会立即执行,因此当您尝试开始迭代(或检索项目)时会看到错误。

enumerator = Enumerator.new(&:map)
enumerator.take(1)
# NoMethodError (undefined method `map' for #<Enumerator::Yielder:0x00000000055b6e90>)

这是因为 Enumerator::new 产生了 Enumerator::Yielder,它没有 map.

方法

上面也可以写成:

enumerator = Enumerator.new { |yielder| yielder.map }

如果您想从集合中创建枚举器,最简单的方法是直接调用 eachmap 等其他方法也可以在不给定块的情况下创建枚举器。

enumerator = [1, 2, 3].each
#=> #<Enumerator: [1, 2, 3]:each>

如果您出于某种原因仍想手动创建枚举器,它可能如下所示:

enumerator = Enumerator.new { |yielder| [1, 2, 3].each { |number| yielder << number } }

如果您打算在接收集合之前预选一种迭代方法,您可以按以下方式进行:

# assuming both the collection and block are passed by the user
map = :map.to_proc
result = map.call(collection, &block)

# which is equivalent to
result = collection.map(&block)