Process模块是否存在私有实例方法‘wait’?Ruby模块引入方法疑惑
关于Process模块的私有实例方法
wait的解惑 嘿,这个问题抓得很准!我来给你理清楚:
首先直接给结论:Process模块确实存在私有实例方法wait,这就是你看到代码能正常运行的核心原因。
为什么include Process后Object类会获得这个方法?
Ruby的模块混入机制里,当你在顶层执行include Process时,本质是把Process模块的实例方法(包括私有实例方法)添加到Object类中——因为顶层上下文的self是main,而main是Object类的实例,include操作会把模块的方法注入到当前self所属类的方法链里。
虽然官方文档可能只重点标注了Process.wait这个类方法,但Process模块内部同时定义了对应的私有实例方法版本。当它被混入Object类后,所有Object的实例(包括main)都拥有了这个私有实例方法。而在Ruby中,私有方法可以在实例的上下文里直接调用(不需要显式指定接收者),所以你能直接写wait而不用加Process.前缀,它的作用和Process.wait完全一致:等待任意子进程终止,返回其PID。
再拆解你的代码片段
include Process fork { exit 99 } #=> 27429 wait #=> 27429 $?.exitstatus #=> 99
这里的wait就是调用了main(Object实例)的私有实例方法,和调用Process.wait是等价的,所以能正常获取到子进程的PID,之后通过$?也能拿到子进程的退出状态码。
简单来说,这是Ruby模块混入机制和私有方法调用规则共同作用的结果,文档没特意强调私有实例方法版本,但它确实存在~
内容的提问来源于stack exchange,提问作者雷海波
相关产品推荐
相关产品推荐

