顶级方法的定义

时间:2016-03-24 04:23:23

标签: ruby

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

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继承了自己?

修改

我更新了我的问题。

问题#1

方法的定义是否意味着在Object中添加一些方法作为私有实例方法 这是对的吗?

问题#2

ObjectClass的一个实例。因此,Object拥有私有类方法。这些方法作为Class中的私有实例方法 这是对的吗?

问题#3

取决于问题#1和#2。 Class继承Object。因此,Class拥有greet作为私有类方法和私有实例方法。 这是对的吗?

2 个答案:

答案 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中没有类方法。

greetObject的私有实例方法。 ObjectClass的实例,ClassModule的子类,ModuleObject的子类,ergo {{1} }是Object的一个实例,即它本身。

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

  

但是我想知道哪个类拥有Object作为私有类方法。

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

  

Object会继承自己吗?

没有。 Object实例。

  

问题#1

     

方法的定义是否意味着在Object中添加一些方法作为私有实例方法   这是对的吗?

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

  

问题#2

     

ObjectObject的一个实例。因此,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.greetObject.greet都产生与greet相同的结果,因此greet(在顶层定义) irb)不能是私人方法。

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