Доступ к области действия экземпляра из области действия класса - PullRequest
0 голосов
/ 06 января 2012
class Appointment
  def self.listen_to(*methods)
    methods.each do |method_sym|
      mth = method(method_sym) # <- doesn't find method `something`
      define_method(method_sym) do
        print "<listen>#{mth.call}</listen>"
      end
    end
  end

  def something
    print "doing something"
  end

  listen_to :something
end

Undefined method 'something' for class 'Class'.Кажется, проблема в том, что method(:somesymbol) смотрит в область видимости класса, а не в область действия экземпляра для метода.

Как я могу получить доступ к something -методу из def self.listen_to -метода класса?

1 Ответ

2 голосов
/ 06 января 2012

Вам нужно использовать instance_method, а не method:

mth = instance_method(method_sym)

Не часть вопроса, но вопрос об использовании метода будет более серьезным.Я бы использовал alias_method, чтобы переименовать старый метод, и использовать send, чтобы вызвать его.

> class Appointment
*   def self.listen_to(*methods)  
*     methods.each do |sym|    
*       new_sym = "__orig_#{sym}".to_sym      
*       alias_method new_sym, sym      
*       mth = instance_method(sym) # <- doesn't find method `something`      
*       define_method(sym) do      
*         "<listen>#{send new_sym}</listen>"        
*       end        
*     end      
*   end    
*   
*   def something  
*     "doing something"    
*   end    
*   
*   listen_to :something  
* end  
> puts Appointment.new.something
<listen>doing something</listen>
...