gpt4 book ai didi

ruby - 枚举器如何在方法执行过程中停止?

转载 作者:数据小太阳 更新时间:2023-10-29 07:35:50 24 4
gpt4 key购买 nike

(示例来自 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 方法执行似乎在第一行之后停止。如果 names 被完全执行,@names 应该变为空。这种魔法(= 部分调用方法)是如何发生的?

最佳答案

它按预期工作。在调用 enum.next 时,它调用 names 方法中的第一行,然后 yields 给调用者,即在该点停止 names 方法的执行流程。在下一次调用 enum.next 时,执行流程从它停止的地方开始。

Ruby 实际上有一个名为 Fiber 的对象,它可以更简洁地说明这一点:http://apidock.com/ruby/Fiber它们允许您通过调用 Fiber.yield 和稍后停止的地方的 resume 在程序的任意点“暂停执行”。

比如上面的例子:

@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

关于ruby - 枚举器如何在方法执行过程中停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29551792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com