我想基于所有方法编写一个简单的回调函数,只需添加一个额外的单词'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"]
我真的很困惑,感谢你的帮助。感谢。
答案 0 :(得分:1)
问题出在以下几行:
alias_method :old_meth, meth
您将每个原始方法别名为old_meth
(对所有这些方法使用相同的名称),因此原始方法不会被保留,除了最后一次迭代。要么动态生成old_<method>
名称,要么使用其他存储(例如Hash)来存储原始方法。