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),但是如果我只是使用这种方式将参数传递给一个方法,那么它就可以正常工作。如下:

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 回答