2016-07-19 3 views
2

Я смущен этими двумя классами, когда читал документ модуля. Прежде всего, я увидел, что есть способ установить именованную константу для данного объекта.Объект и модуль Ruby

Object.const_set("FOO", 40)

Но я проверить рубиновый документ, не существует в Object методе нет const_set, тогда я узнал, что это было определено в Module.

Я думал, что Object является корнем по умолчанию всех объектов Ruby. Почему он может использовать метод модуля? Я смущен насчет отношений между ними.

+0

Вот подсказка: если вы звоните '«Hello'.upcase', где бы вы посмотрите на 'upcase' метод ... в строке'»Hello'' или в своем классе (' String') и его суперклассы? Теперь, если вы вызываете 'Object.const_set', где бы вы искали метод' const_set' ... в классе 'Object' или в его классе (' Class') и его суперклассах? –

ответ

2

Как показано ниже :const_set является методом экземпляра хранятся в Module:

Module.instance_methods(false).include? :const_set #=> true 

Также отметим, что Object является экземпляром Class:

Object.instance_of? Class #=> true 

И Class подкласс Module:

Class.superclass #=> Module 

Все это означает, что методы экземпляра, определенные в пределах Module, доступны для Class объектов через наследование. Таким образом, любой экземпляр Class (такой как Object) имеет в своем распоряжении все методы экземпляра (включая :const_set), хранящиеся в Module.

+1

Спасибо, это понятно. Ruby - это действительно удивительный язык для меня. –

1

В рубине, в основном каждый класс является экземпляром класса Class, и каждый класс является подклассом Object. И как Object, так и Class являются классами. Если вы

Object.is_a?class 
Class.is_a?class 

В обоих случаях вы получите значение true. Class имеет Module в качестве одного предка, поэтому вы можете использовать

Object.const_set("FOO", 40) 
0

Существует также #ancestors, чтобы дать вам больше контекста на объектной модели.

> Module.ancestors 
=> [Module, Object, PP::ObjectMixin, Kernel, BasicObject]