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

Pat*_*ard 5 ruby object

我看了这个:

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

def say_goodnight(name)
    result = "Goodnight, " + name
    return result
end
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_*ski 12

当你以这种方式在全局范围内在Ruby中定义一个函数时,它在技术上成为了类的一个private方法Object,它是Ruby中所有东西都继承的基类.Ruby中的所有东西都是一个对象,所以确定一个方法确实如此.

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

Object.private_methods.include? :say_goodnight
=> true
Run Code Online (Sandbox Code Playgroud)

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

基本上,Ruby程序本身定义了一个Object被调用的实例main,它作为定义方法的顶级范围.因此,如果您认为您的程序在内部 运行main(这是一个Object),其私有方法可供使用.

# In irb:
self
=> main
self.class
=> Object
self.private_methods.include? :say_goodnight
=> true
Run Code Online (Sandbox Code Playgroud)

附录: 这个答案进一步解释了如何main定义和实施.