0

送信オブジェクトを上書きしたい、のように

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'

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

更新: 2.9.1 に更新しようとしましたが、問題は解決しませんでした

4

1 に答える 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-parameterを追加する必要があります。

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
于 2011-12-19T23:07:52.480 に答える