2012-01-17 5 views
2

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

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

+0

Не думаю, что так - метод не хватает, если есть суперкласс реализация. –

ответ

5

Не то, чтобы я знал.

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

Такие, как:

class Foo 
    def method_missing(name, str) 

    # log something out when we call method_missing so we know it only happens once 
    puts "Defining method named: #{name}" 

    # Define the new instance method 
    self.class.class_eval <<-CODE 
     def #{name}(arg1) 
     puts 'you passed in: ' + arg1.to_s 
     end 
    CODE 

    # Run the instance method we just created to return the value on this first run 
    send name, str 
    end 
end 

# See if it works 
f = Foo.new 
f.echo_string 'wtf' 
f.echo_string 'hello' 
f.echo_string 'yay!' 

Что выплевывает это при запуске:

Defining method named: echo_string 
you passed in: wtf 
you passed in: hello 
you passed in: yay! 
+0

Мне нравится эта идея - спасибо. – Finbarr

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