2013-02-25 3 views
1

В приведенном ниже коде я не понимаю, почему классы возвращают свои имена.Путаница с `include` внутри определения класса

module Show 
    def show_string 
    p "hi" 
    end 
end 

class Foo 
    @x=12 
    include Show 
end 
# => Foo 

class Test 
    include Show 
end 
# => Test 

Чтобы увидеть причину, я вставил object_id. И теперь он показывает идентификатор объекта.

class Foo 
    @x=12 
    (include Show).object_id 
end 
# => 10681980 

class Too 
    @x=12 
    (include Show).object_id.inspect 
end 
# => "10648020" 

Я не создавал объект на Foo.new и Too.new. Создаются ли такие объекты внутри определений классов?

ответ

2

При определении модуля/класса, возвращаемое значение является последнее выражение в теле:

module A; :foo end 
# => :foo 

Когда тело пусто, она возвращает nil.

module A; end 
# => nil 

Теперь обратите внимание, что возвращаемое значение include является модуль, в том числе. Вы можете увидеть это в main среды:

p (include A) 
# => Object 

Так что, когда вы делаете include A внутри модуля тела B, возвращаемое значение должно быть значением последнего выражения include A, что B.

module B 
    include A 
end 
# => B 

Вы не создали экземпляр Foo или Too. Идентификаторы объектов, которые вы видите, являются идентификаторами объекта класса Foo и Too.

+0

Спасибо за разъяснения. Но означает ли это, когда мы создаем новые определения классов, 'object_id' также создаются из них или это имеет место только с инструкцией' include'? –

+0

Любой объект имеет идентификатор объекта с самого начала. Класс - это объект. – sawa

+1

Да! Я понял, что сейчас ... Я счастлив ... ВАМ мой SIR :) вот моя попытка - 'класс Foo конец # => nil Foo.object_id # => 9189204' –

1

В вашем первом примере кода классы не возвращают свои имена. Они возвращают классы сами, которые irb отображает как имя класса.

Для вашего второго блока кода возвращаемое значение #include - это класс, выполняющий включение. Идентификатор объекта, который вы видите во втором блоке кода, это идентификаторы Foo и Too. Отвечает ли это на ваш вопрос?

+0

Нет. Я спрашиваю, почему без объектов '.new' создаются? –

+1

@ LoveConcept Это не так. –

Смежные вопросы