Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby对象和模块_Ruby_Object_Module - Fatal编程技术网

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
方法?