顶级方法的定义
我想知道顶级方法的定义。
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
是一个私有类方法。 但我想知道哪个类拥有作为私有类方法的greet
。 Object
inheritance自己?
编辑
我更新了我的问题。
问题#1
方法的定义是指在Object
添加一些方法作为私有实例方法。
它是否正确 ?
问题2
Object
是Class
一个实例。 因此, Object
拥有私有类方法。 这些方法作为Class
私有实例方法。
它是否正确 ?
问题#3
取决于问题#1和#2。 Class
inheritanceObject
。 因此, 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中没有类方法。
greet
是Object
的私有实例方法。 Object
是Class
一个实例, Class
是Module
的子类, Module
是Object
的子类,ergo Object
是Object
的一个实例,即它本身。
换句话说: Object
中定义的方法可用于所有对象。 类也是对象, Object
中定义的ergo方法可用于所有类,包括Object
。
但我想知道哪个类拥有作为私有类方法的
greet
。
没有。 Ruby中没有类方法。 greet
是Object
的私有实例方法。
Object
inheritance自己?
不。 Object
是它自己的一个实例 。
问题#1
方法的定义是指在
Object
添加一些方法作为私有实例方法。
它是否正确 ?
在顶层定义的方法成为Object
私有实例方法。
问题2
Object
是Class
一个实例。 因此,Object
拥有私有类方法。 这些方法作为Class
私有实例方法。
它是否正确 ?
抱歉,我无法解析你的问题。
但是,示例中没有Class
私有实例方法。 示例中唯一的方法是greet
,它是Object
的私有实例方法,而不是Class
。
如果你想知道谁拥有一个方法,你可以问问Ruby:
method(:greet).owner # => Object
问题#3
取决于问题#1和#2。
Class
inheritanceObject
。 因此,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.greet
和Object.greet
都产生与greet
相同的结果,因此greet
(在irb中的顶层定义)不能是私有方法。
使用ruby编译器时情况不同。