2011-12-19 5 views
0

をクラッシュし、私はそう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 

のように、オブジェクトに送信overwiteしたいが、すべてこのオプションは、このエラーが

を出現させます
/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' 

できることはありますか?

更新: 2.9.1に更新しようとしましたが、それは私があなたの問題を分析することは困難であるMWEがなければ問題

答えて

1

を解決していません。おそらく私はあなたの問題の最初のヒントを発見しました。

私は、エラーを再構築しようとしましたが、成功せず:

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 
関連する問題