自己画了一个图来表示 Ruby 中对象的继承关系,不确定是不是有疏漏和不正确的地方,路过的前辈如果有空,麻烦帮小弟看看,提前谢过!
另外,在画这个图的过程中有一个问题没想明白,想请教一下:
Kernel 定义了很多便利的 instance methods,可以在对象内部或全局作用域下(也是对象内部,只不过是 Object 内部)通过祖先链查找到进行调用,但是我看到 Kernel 还定义了很多 singleton methods,并且和 instance methods 方法名是一样的,比如print
,在继承关系中这些 singleton_methods 貌似是孤立的,在不用其他方式修改 self 的指向时应该只能通过 Kernel.xxx 的形式来调用吧,难道只是为了多提供一种方式来调用类似print
这样的方法?还请了解的大佬帮助指点迷津,介绍下 Kernel 中这些与 instance methods 重名的 singleton methods 存在的意义和使用场景,非常感谢!
如下是我简单打印的 Kernel 中命名一样的 instance methods 和 singleton methods:
instance_methods_in_kernel = Kernel.private_instance_methods(false) << Kernel.public_instance_methods(false)
singleton_methods_in_kernel = Kernel.singleton_methods(false)
filter = ->(method_name) {singleton_methods_in_kernel.include? method_name}
methods_with_the_same_name = instance_methods_in_kernel.select(&filter)
p methods_with_the_same_name
# =>
[
:sprintf,
:format,
:Integer,
:Float,
:String,
:Array,
:Hash,
:warn,
:local_variables,
:require_relative,
:autoload,
:autoload?,
:raise,
:fail,
:global_variables,
:__method__,
:__callee__,
:__dir__,
:binding,
:require,
:URI,
:eval,
:iterator?,
:block_given?,
:catch,
:throw,
:loop,
:Rational,
:Complex,
:trace_var,
:untrace_var,
:at_exit,
:set_trace_func,
:select,
:`,
:caller,
:caller_locations,
:test,
:fork,
:exit,
:sleep,
:gets,
:proc,
:lambda,
:load,
:exec,
:exit!,
:system,
:spawn,
:abort,
:syscall,
:open,
:printf,
:print,
:putc,
:puts,
:readline,
:readlines,
:p,
:rand,
:srand,
:trap
]