ruby – Enumerator如何在方法执行过程中停止?

(例子来自
Ruby Tapas第59集)

@names = %w[Ylva Brighid Shifra Yesamin]

def names
  yield @names.shift
  yield @names.shift
  yield @names.shift
  yield @names.shift
end

enum = to_enum(:names)
enum.next # => Ylva
@names    # => ["Brighid", "Shifra", "Yesamin"]

名称方法执行似乎在第一行后停止.如果完全执行名称,则@names应为空.这个神奇的(部分调用方法)怎么会发生?

最佳答案 它按预期工作.在调用enum.next中,它调用names方法中的第一行,然后产生给调用者,即在该点停止执行names方法的流程.在下一次调用enum.next时,执行流程将从它停止的位置获取.

Ruby实际上有一个名为Fibre的对象,可以更简洁地演示它:http://apidock.com/ruby/Fiber它们允许您通过调用Fiber.yield在程序中的任意点“暂停执行”,并在稍后停止的位置继续.

例如,上面的例子:

@names = %w[Ylva Brighid Shifra Yesamin]
fiber = Fiber.new do
  Fiber.yield @names.shift # yields control to the caller
  Fiber.yield @names.shift
  Fiber.yield @names.shift
  Fiber.yield @names.shift
end

# the resume calls give control to the fiber at the point we left off
puts fiber.resume #=> Ylva
puts fiber.resume #=> Brighid
puts fiber.resume #=> Shifra
puts fiber.resume #=> Yesamin
点赞