顶级方法的定义

我想知道顶级方法的定义。

puts RUBY_VERSION #=> 2.1.5 def greet "hello, world" end class Object greet #=> "hello, world" end 

为什么greet得像私有类方法?

 puts RUBY_VERSION #=> 2.1.5 def greet "good morning" end # case 1 Object.private_methods(false).grep /greet/ #=> [] # case 2 Object.private_instance_methods(false).grep /greet/ #=> [:greet] # case 3 Object.private_methods(true).grep /greet/ #=> [:greet] 

在案例3中,我发现greet是一个私有类方法。 但我想知道哪个类拥有作为私有类方法的greetObjectinheritance自己?

编辑

我更新了我的问题。

问题#1

方法的定义是指在Object添加一些方法作为私有实例方法。
它是否正确 ?

问题2

ObjectClass一个实例。 因此, Object拥有私有类方法。 这些方法作为Class私有实例方法。
它是否正确 ?

问题#3

取决于问题#1和#2。 ClassinheritanceObject 。 因此, Class拥有greet作为私有类方法和私有实例方法。 它是否正确 ?

为什么greet得像私有类方法?

它没有。 它就像一个私有实例方法。 (实际上,Ruby中没有类方法,只有实例方法。问题不在于方法是实例方法还是类方法,而是实例方法定义的类。)

在顶层定义的方法成为Object私有实例方法。

 # case 1 Object.private_methods(false).grep /greet/ #=> [] # case 2 Object.private_instance_methods(false).grep /greet/ #=> [:greet] # case 3 Object.private_methods(true).grep /greet/ #=> [:greet] 

在案例3中,我发现greet是一个私有类方法。

就像我上面说的:Ruby中没有类方法。

greetObject的私有实例方法。 ObjectClass一个实例, ClassModule的子类, ModuleObject的子类,ergo ObjectObject的一个实例,即它本身。

换句话说: Object中定义的方法可用于所有对象。 类也是对象, Object中定义的ergo方法可用于所有类,包括Object

但我想知道哪个类拥有作为私有类方法的greet

没有。 Ruby中没有类方法。 greetObject的私有实例方法。

Objectinheritance自己?

不。 Object是它自己的一个实例

问题#1

方法的定义是指在Object添加一些方法作为私有实例方法。
它是否正确 ?

在顶层定义的方法成为Object私有实例方法。

问题2

ObjectClass一个实例。 因此, Object拥有私有类方法。 这些方法作为Class私有实例方法。
它是否正确 ?

抱歉,我无法解析你的问题。

但是,示例中没有Class私有实例方法。 示例中唯一的方法是greet ,它是Object的私有实例方法,而不是Class

如果你想知道谁拥有一个方法,你可以问问Ruby:

 method(:greet).owner # => Object 

问题#3

取决于问题#1和#2。 ClassinheritanceObject 。 因此, Class拥有> greet作为私有类方法和私有实例方法。 它是否正确 ?

不。在Ruby中没有类方法,只有实例方法。 并且greet不归Class ,它是Object的私有实例方法:

 method(:greet).owner # => Object 

使用irb,在顶层定义greet不会将greet定义为私有方法,至少使用ruby 2.x:

 $ irb > RUBY_VERSION => "2.3.0" > def greet; "hi"; end => :greet > Object.methods.grep /greet/ => [:greet] > Object.private_methods.grep /greet/ => [] > Object.private_instance_methods.grep /greet/ => [] 

在ruby中,“私有方法”是指通过常规方式无法使用显式“接收器”调用的方法。 (参见例如此SO页面 。)由于self.greetObject.greet都产生与greet相同的结果,因此greet (在irb中的顶层定义)不能是私有方法。

使用ruby编译器时情况不同。