为什么允许在Ruby之外的类之外定义全局方法?

时间:2015-01-04 16:14:57

标签: ruby object

我读到了这个:

  

让我们从一个简单的Ruby程序开始吧。我们会写一个方法   返回一个愉快,个性化的问候。

def say_goodnight(name)
    result = "Goodnight, " + name
    return result
end

我的理解是方法是在类中定义的函数或子例程,它可以与类(类方法)或对象(实例方法)相关联。

那么,如果没有在类中定义它,那该怎么办呢?

1 个答案:

答案 0 :(得分:11)

当您以这种方式在全局范围内在Ruby中定义函数时,它在技术上成为private类的Object方法,它是Ruby中所有内容的基类。 Everything in Ruby is an object,所以确定一个方法确实如此。

def say_goodnight(name)
    result = "Goodnight, " + name
    return result
end

Object.private_methods.include? :say_goodnight
=> true

因为它被定义为在private上具有Object可见性的方法,所以它只能在其定义的类或子类的对象内部调用。那为什么它似乎在全球范围内可用呢?

基本上,Ruby程序本身定义了一个名为Object的{​​{1}}实例,它作为定义方法的顶级范围。因此,如果您认为您的程序在 main内运行main),则可以使用其私有方法。

Object

<强>附录: This answer进一步解释了如何定义和实施# In irb: self => main self.class => Object self.private_methods.include? :say_goodnight => true