如何动态覆盖方法
How to overwrite a method dynamically
我想通过调用方法 f
动态覆盖方法 Hash#[]=
。以下代码不起作用,因为方法内部不允许 class 定义:
def f
class Hash
def []=(k, v)
...
end
end
end
解决方法是将 class Hash
放在单独的文件中,然后
def f
require 'my_hash.rb'
end
不知道有没有办法避免添加单独的文件。
def f
Hash.send(:define_method, :[]=) do |x, y|
...
end
end
这是另一种方法:
def f
Hash.class_eval do
def []=(k, v)
#...
end
end
end
我想通过调用方法 f
动态覆盖方法 Hash#[]=
。以下代码不起作用,因为方法内部不允许 class 定义:
def f
class Hash
def []=(k, v)
...
end
end
end
解决方法是将 class Hash
放在单独的文件中,然后
def f
require 'my_hash.rb'
end
不知道有没有办法避免添加单独的文件。
def f
Hash.send(:define_method, :[]=) do |x, y|
...
end
end
这是另一种方法:
def f
Hash.class_eval do
def []=(k, v)
#...
end
end
end