我终于找到了让它运转的方法。如果我们重新定义 initialize 它会失败,因为内部不会初始化光纤。但是,可以对其进行别名,创建一个新的,然后运行旧的:
initialize
class Fiber alias_method :old_init, :initialize def initialize old_init @parent = Fiber.current end def parent @parent end end
自从 Fiber.current 在我们执行之前不会改变 resume 在光纤上,我们可以安全地复制初始化器中的引用。
Fiber.current
resume
现在我们可以问系统“谁是你的爷爷?” Fiber.current.parent.parent 。
Fiber.current.parent.parent