2011-12-19 5 views
0

Я хочу overwite отправить в объект, как иMiniTest разваливается

class Object 
    @@object_send = self.instance_method(:send) 

    def send *args 
     @@object_send.bind(self).call *args 
    end 
end 

или

class Object 
    def send *args 
     __send__ *args 
    end 
end 

или

class Object 
    alias_method :old_send, :send 

    def send *args 
     old_send *args 
    end 
end 

, но все эти опции, причиной этой ошибки появляются

/opt/local/lib/ruby1.9/gems/1.9.1/gems/minitest-2.8.1/lib/minitest/unit.rb:871:in `block in process_args': unsupported argument type: Integer (ArgumentError) 
    from /opt/local/lib/ruby1.9/gems/1.9.1/gems/minitest-2.8.1/lib/minitest/unit.rb:862:in `new' 
    from /opt/local/lib/ruby1.9/gems/1.9.1/gems/minitest-2.8.1/lib/minitest/unit.rb:862:in `process_args' 
    from /opt/local/lib/ruby1.9/gems/1.9.1/gems/minitest-2.8.1/lib/minitest/unit.rb:912:in `_run' 
    from /opt/local/lib/ruby1.9/gems/1.9.1/gems/minitest-2.8.1/lib/minitest/unit.rb:905:in `run' 
    from /opt/local/lib/ruby1.9/gems/1.9.1/gems/minitest-2.8.1/lib/minitest/unit.rb:685:in `block in autorun' 

Есть ли что-нибудь, что я могу сделать?

Update: Пробовал обновление до 2.9.1, но это не решило проблему

ответ

1

Без MWE это трудно для меня, чтобы проанализировать вашу проблему. Возможно, я нашел первый намек на вашу проблему.

Я попытался восстановить ошибку, но без успеха:

class Object 
    alias_method :old_send, :send 

    def send *args 
     old_send *args 
    end 
end 
n = 5 
puts n.send(:*, 2) 

я 10.

Но с блоками я получаю проблему:

puts n.send(:times){ |i| p i } #-> #<Enumerator:0xb778a8> 

С незначительными изменениями вы можете увидеть, что происходит:

class Object 
    alias_method :old_send, :send 

    def send *args 
     puts "send called with #{args}" #--> [:times] 
     old_send *args 
    end 
end 

n = 5 
n.send(:times){ |i| p i } 

Вы

send called with [:times] 

Блок отсутствует. Вы должны добавить параметр proc к вашему переопределению:

class Object 
    alias_method :old_send, :send 

    def send *args, &proc 
     old_send *args, &proc 
    end 
end 

n = 5 
n.send(:times){ |i| p i } #-> 1 2 3 4 5 
Смежные вопросы