在Ruby中,该方法puts是Kernel模块的单例方法。
通常,当一个模块是另一个模块的included或extended时,该模块(而不是其单例类)将被添加到继承树中。这有效地使模块的实例方法可用于该模块或其单例类(分别用于include和extend)...但是混合模块的单例方法仍然不可访问,因为模块的单例类不是曾经添加到继承树中。
那为什么要使用puts(和其他内核单例方法)?
Kernel.singleton_methods(false)
# => [:caller_locations, :local_variables, :require, :require_relative, :autoload, :sprintf, :format, :Integer, :Float, :String, :Array, :Hash, :test, :warn, :autoload?, :fork, :binding, :exit, :raise, :fail, :global_variables, :__method__, :__callee__, :__dir__, :URI, :eval, :iterator?, :block_given?, :catch, :throw, :loop, :gets, :sleep, :proc, :lambda, :trace_var, :untrace_var, :at_exit, :load, :Rational, :select, :Complex, :syscall, :open, :printf, :print, :putc, :puts, :readline, :readlines, :`, :p, :system, :spawn, :exec, :exit!, …Run Code Online (Sandbox Code Playgroud) 我的印象是obj.method导致红宝石method如此寻找:
obj单身课.obj单例类所包含的模块.obj上课.obj班级所包含的模块method_missing原始对象obj.在这个模型下,搜索该方法的唯一单例类是原始接收器的单例类obj.但是,这个模型无法解释子类可以访问其超类的单例方法的事实.例如
class Foo
def self.foo
"foo"
end
end
class Bar < Foo
end
Bar.foo #=> "foo"
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为我相信这意味着Foo单身类在某些时候搜索了这个方法foo.但是,根据上面的模型,我希望只Bar搜索单例类foo.如果做不到这一点,我希望ruby可以查看Bar类,Class然后继续爬上超类链(Foo完全跳过它的单例类).
所以我的问题是:我对Ruby方法查找的理解缺少什么,这解释了一个类可以访问其超类的单例方法的事实?
Class类的文档有一个令人难以置信的混乱图,涉及"元类".我试图揭开这里实际发生的事情的神秘面纱.这三个词都是......
Ruby中的同义词?我知道元类在Python中意味着特定和不同的东西,例如,但在Ruby中呢?