ruby - 如何实现基本的 Enumerator 类?

标签 ruby ienumerator

我想了解 Enumerator 类的工作原理。具体来说,我不知道 yielder 对象是如何创建并传递给构造函数采用的代码块的。

这是我的第一次尝试:

class MyEnumerator
  def initialize(&block)
    @block = block
  end 
  def next()
    @block.call self
  end 
  def yield(*args)
    args
  end 
end


num_gen = MyEnumerator.new do |yielder|
  (1..10).each { |num| yielder.yield num }
end

5.times { p num_gen.next }

它不起作用,当然是因为我不知道如何推进枚举器。有人可以帮助我了解如何实现它吗?

最佳答案

您应该使用某种延续 的机制。检查:

http://www.ruby-doc.org/docs/ProgrammingRuby/html/ref_c_continuation.html

http://ruby-doc.org/docs/ProgrammingRuby/html/ref_m_kernel.html#Kernel.callcc

此外,用纤程实现枚举器应该是非常简单的(但如果您想理解整个事情,它们可能太“高级”了,那么请尝试继续):

http://www.ruby-doc.org/core-1.9.2/Fiber.html

关于ruby - 如何实现基本的 Enumerator 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7756953/

相关文章:

ruby-on-rails - 使用 Searchkick 或 Rails + ElasticSearch 在地理多边形内进行记录

ruby-on-rails - 事件记录中包含 OR 的 where 子句的正确语法

c# - 为固定数组实现 IEnumerator<T>

c# - 枚举产生方法时可能不会调用 finally block

c# - 协程中的 Vector3.Lerp 在 Unity3D 上无法正常工作

ruby-on-rails - 删除在同一索引处具有重复值的子数组

ruby - 更改参数[ :link] before @link. 保存

ruby - 处理复合记录的 Rails 模型

c# - 将引用(以及Unity的WWW.progress)传递给协同程序/IEnumerator

c# - IEnumerable 在底层与 IObservable 有何不同?