我想知道顶级方法的定义。
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
继承了自己?
我更新了我的问题。
方法的定义是否意味着在Object
中添加一些方法作为私有实例方法
这是对的吗?
Object
是Class
的一个实例。因此,Object
拥有私有类方法。这些方法作为Class
中的私有实例方法
这是对的吗?
取决于问题#1和#2。 Class
继承Object
。因此,Class
拥有greet
作为私有类方法和私有实例方法。
这是对的吗?
答案 0 :(得分:2)
为什么
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 {{1} }是Object
的一个实例,即它本身。
换句话说:Object
中定义的方法可用于所有对象。类也是对象,Object
中定义的ergo方法适用于所有类,包括Object
。
但是我想知道哪个类拥有
Object
作为私有类方法。
无。 Ruby中没有类方法。 greet
是greet
的私有实例方法。
Object
会继承自己吗?
没有。 Object
是的实例。
问题#1
方法的定义是否意味着在
Object
中添加一些方法作为私有实例方法 这是对的吗?
在顶级定义的方法成为Object
的私有实例方法。
问题#2
Object
是Object
的一个实例。因此,Class
拥有私有类方法。这些方法作为Object
中的私有实例方法 这是对的吗?
我无法解析你的问题,抱歉。
但是,示例中没有Class
的私有实例方法。示例中唯一的方法是Class
,它是greet
的私有实例方法,而不是Object
。
如果你想知道谁拥有一个方法,你可以问问Ruby:
Class
问题#3
取决于问题#1和#2。
method(:greet).owner # => Object
继承Class
。因此,Object
拥有>Class
作为私有类方法和私有实例方法。 这是对的吗?
没有。 Ruby中没有类方法,只有实例方法。 greet
不归greet
所有,它是Class
的私有实例方法:
Object
答案 1 :(得分:0)
使用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中,一种"私有方法"是一个不能用明确的"接收器"以通常的方式。 (参见例如this SO page。)由于self.greet
和Object.greet
都产生与greet
相同的结果,因此greet
(在顶层定义) irb)不能是私人方法。
使用ruby编译器时情况有所不同。