如何使用alias_method回调所有Array方法?

时间:2012-07-27 10:05:59

标签: ruby methods callback alias

我想基于所有方法编写一个简单的回调函数,只需添加一个额外的单词'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,&amp; 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"]

我真的很困惑,感谢你的帮助。感谢。

1 个答案:

答案 0 :(得分:1)

问题出在以下几行:

alias_method :old_meth, meth

您将每个原始方法别名为old_meth(对所有这些方法使用相同的名称),因此原始方法不会被保留,除了最后一次迭代。要么动态生成old_<method>名称,要么使用其他存储(例如Hash)来存储原始方法。