2015-02-20 3 views
0

Напримерв ruby, можно ли переопределить контекст выполнения добавленного метода?

class Foo 

    def bar 
    end 

end 

В этом коде, бар будет доступен только в пределах любого экземпляра класса.

Можно ли изменить контекст выполнения метода на Eigenclass , не изменяя способ определения самого метода, чтобы теперь метод был доступен как одноэлементный, без необходимости звонить self.new?

Предпочтительно, я хотел бы сделать это любым из кода, который делает это для кода, который добавляется через класс, который Foo может наследовать.

В настоящее время, что я делаю составляет:

class Test 

    def method_added method 
    self.define_singleton_method method do 
     self.new.send method 
    end 
    end 

end 

и за то, что мне нужно это не работает, как я меняю контекст выполнения, вызвав new.

ответ

0

Я разработал, как это сделать сейчас> _ <.

Вот код:

class Test 
    def method_added method 
     m = self.new.method(method) #get method object 
     self.define_singleton_method(method) do #create method with same name within the singleton class 
      m.call #call the block which will now run the code of the added method within the context of the Eigenclass/Singleton 
     end 
    end 
end 

Так что он делает это захватывает объект метод формирования экземпляра, а затем вызывает этот метод в качестве блока в контексте класса.

Таким образом, первый пример кода становится:

class Foo < Test 

    def bar 

    end 

end 

и метод bar теперь могут быть доступны как Foo.bar, а затем Foo.new.bar что не означает создание экземпляра; помимо времени, которое он делает в добавленном методе, но это прекрасно, поскольку это единственный способ получить объект метода, насколько мне известно.

Вот почему, вероятно, лучше всего создать экземпляр только один раз, когда класс наследуется (в пределах def self.inherited), сохраните его внутри класса, а затем просто получите доступ, вместо того, чтобы звонить self.new.

0

Вы можете просто сделать:

class Test 
    def self.method_added method 
    module_function method 
    end 
end 

class A < Test 
    def foo 
    :hello 
    end 
end 

A.foo #=> :hello 
+0

Я не думаю, что работает в объектах класса. – Thermatix

+0

Вы пробовали? – BroiSatse

+0

Да, это просто ошибки с 'undefined method 'module_function' для теста: Class:' – Thermatix

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