没有集合的枚举器
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 }
如果您想从集合中创建枚举器,最简单的方法是直接调用 each
。 map
等其他方法也可以在不给定块的情况下创建枚举器。
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)
我有 运行 进入这个结构:
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 }
如果您想从集合中创建枚举器,最简单的方法是直接调用 each
。 map
等其他方法也可以在不给定块的情况下创建枚举器。
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)