2014-09-18 2 views
2

Я действительно не понимая этого Ruby Monk exercise:Methods_added методов Singleton, но не методы класса

Там очень важный нюанс, который стоит понимать, когда дело с singleton_method_added и method_added.

Самый естественный способ, которым ум принимает эти два обратных вызова, состоит в том, чтобы предположить, что method_added будет наблюдать методы экземпляра и методы oneton_method_added, class. Это, однако, не совсем верно; Объект Singleton Ruby поддерживает обычные объекты и содержит изменения, специфичные для объекта. Для классов это методы класса. Но при добавлении метода к одному, регулярному объекту, добавление методов экземпляра только к этому объекту модифицирует одноэлементный объект для этого объекта.

Позвольте мне показать вам, почему, решив это упражнение.

Упражнение:

AN_OBJECT = Object.new 

def AN_OBJECT.methods_added 
    @@methods_added ||= [] 
end 

def AN_OBJECT.singleton_methods_added 
    @@singleton_methods_added ||= [] 
end 

Моя попытка была сделать это:

def AN_OBJECT.methods_added 
    unless AN_OBJECT.is_a?(Class) 
    @@methods_added ||= [] 
    end 
end 

def AN_OBJECT.singleton_methods_added 
    if AN_OBJECT.instance_of?(Object) 
    @@singleton_methods_added ||= [] 
    end 
end 

Но данные по-прежнему терпят неудачу.

У меня действительно возникают проблемы, обертывая мою голову тем, что именно они хотят от меня. Что такое одноэлементный объект? Из того, что я понимаю, одноэлементный класс является своего рода «метаклассом», который существует исключительно для того, чтобы дать поведение определенному экземпляру класса.

Является ли одноэлементный объект своего рода «метаобъектом», который существует исключительно для того, чтобы дать поведение определенному экземпляру объекта? Это действительно сбивает меня с толку.

+0

Я думаю, что это опечатка в книге и вместо этого следует читать «singleton class». –

+0

Вижу, спасибо за разъяснение! – abustamam

+0

@abustamam Можете ли вы пройти тест? –

ответ

2

Eureka!

AN_OBJECT = Object.new 

def AN_OBJECT.methods_added 
    @@methods_added ||= [] 
end 

def AN_OBJECT.singleton_methods_added 
    @@singleton_methods_added ||= [] 
end 

def AN_OBJECT.singleton_method_added(method_name) 
    @@singleton_methods_added ||= [] 
    @@singleton_methods_added << method_name 
end 

Если вы посмотрите на предыдущий, если физические упражнения прокрутки вверх, это должно дать вам достаточно намека на то, как справиться с этим. Это трагедия, которую я опубликовал так много позже.

+0

вы не создаете «def AN_OBJECT.method_added (имя_пользователя)» из-за упражнения, который говорит нам, что мы не хотим добавлять к нему методы. – Alexein

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