0

すべてのメソッドに基づいて、'hello' という言葉を追加するだけの簡単なコールバック関数を書きたいと思います。「エイリアス」を学んだばかりなので、この機能を試してみたいと思います。コードは次のとおりです。

    a = []
class << a
    Array.instance_methods(false).each do |meth|    
            alias_method :old_meth, meth
        define_method(meth) do |*args, &block|
            old_meth *args, &block
            puts "hello"
        end
    end 
end
a.push "good"

コードの実行中に、次のエラーが発生します。

DRBServer.rb:6:in `pack': too few arguments (ArgumentError)

次に、「pack」関数が原因だと思うので、「pack」関数を次のようにフィルタリングします。

Array.instance_methods(false).each do |meth|    
if meth != :pack
....
end

次に、別の関数「drop_while」について不平を言います...

DRBServer.rb:7:in `drop_while': wrong number of arguments(1 for 0) (ArgumentError)

問題はパラメーター (*args、&block) を渡す方法にあるに違いないことはわかっていますが、この方法を使用して 1 つのメソッドにパラメーターを渡すだけであれば、正しく機能します。次のように:

a = []
class << a
          alias_method :old_push, :push
          define_method("push") do |*args, &block|
               old_push *args, &block
               puts "hello"
          end 
end

a.push "good" => [output "hello"]

私は本当に混乱しており、あなたの助けに感謝しています. ありがとう。

4

1 に答える 1

1

問題は次の行にあります。

alias_method :old_meth, meth

すべての元のメソッドに(それらすべてに同じ名前を使用して)エイリアスold_methを付けるため、元のメソッドは、反復された最後のメソッドを除いて保持されません。名前を動的に生成するold_<method>か、元のメソッドを格納するために他のストレージ (ハッシュなど) を使用します。

于 2012-07-27T10:56:31.337 に答える