Ruby对象和模块
在阅读模块文档时,我对这两个类感到困惑。 首先,我看到了一种将命名常量设置为给定对象的方法Ruby对象和模块,ruby,object,module,Ruby,Object,Module,在阅读模块文档时,我对这两个类感到困惑。 首先,我看到了一种将命名常量设置为给定对象的方法 Object.const\u集(“FOO”,40) 但我检查了ruby文档,在方法中没有const_set,然后我发现它是在中定义的 我认为Object是所有Ruby对象的默认根。为什么可以使用模块法?我对它们之间的关系感到困惑。如下所示:const_set是存储在模块中的一个实例方法: Module.instance_methods(false).include? :const_set #=> t
Object.const\u集(“FOO”,40)
但我检查了ruby文档,在方法中没有const_set
,然后我发现它是在中定义的
我认为
Object
是所有Ruby对象的默认根。为什么可以使用模块法?我对它们之间的关系感到困惑。如下所示:const_set
是存储在模块中的一个实例方法:
Module.instance_methods(false).include? :const_set #=> true
Class.superclass #=> Module
还要注意,对象
是类
的一个实例:
Object.instance_of? Class #=> true
而类
是模块
的一个子类:
Module.instance_methods(false).include? :const_set #=> true
Class.superclass #=> Module
所有这些都意味着模块
中定义的实例方法通过继承可用于类
对象。因此,在ruby中,模块
中存储的类的任何实例(如对象
)都可以使用所有实例方法(包括:const_set
),基本上每个类都是类
类的实例,每个类都是对象
的子类。而对象
和类
都是类。如果你这样做
Object.is_a?class
Class.is_a?class
在这两种情况下,您都会得到一个true
值<代码>类
将模块
作为一个祖先,因此,您可以使用
Object.const_set("FOO", 40)
还有#祖先
为您提供有关对象模型的更多上下文
> Module.ancestors
=> [Module, Object, PP::ObjectMixin, Kernel, BasicObject]
谢谢,很清楚。Ruby对我来说真的是一种令人惊讶的语言。这里有一个提示:如果你调用'Hello'.upcase
,你会在哪里寻找upcase
方法…在string'Hello'
或它的类(string
)及其超类中?现在,如果调用Object.const\u set
,您将在类对象
或其类(class
)及其超类中的哪里查找const\u set
方法?