我有一个简单的类和一个简单的方法定义
class Printer
def print
p '1'
end
end现在,我介绍了一个单独的脚本,它通过向print添加一些额外的东西来重新定义print方法
class Printer
alias :old_print :print
def print
old_print
p '2'
end
end我能以编程的方式做到这一点吗?
module Test
def self.redefine_print(arg)
# redefine Printer's print method so that it will print all of the stuff it should
# print, followed by the arg I specified
end
end因此,示例交互可能如下所示
>>>a = Printer.new
>>>a.print
1
>>>Test.redefine_print("new stuff")
>>>a.print
1
new stuff
>>>Test.redefine_print("more")
>>>a.print
1
new stuff
more如果现有实例受到更改的影响,这是可以的(因为将创建任何Printer实例,执行其打印,然后立即释放)
发布于 2013-02-19 04:01:19
您可以使用define_method或一个模块来实现这一点,但是这样做太过分了(而且可能非常慢)。可以(也更简单)使用类变量和类方法:
class Printer
@@tokens = []
def print
@@tokens.each do |token|
p token
end
end
def self.add_token(token)
@@tokens << token
end
end
Printer.add_token("foo")
printer = Printer.new
printer.print
# foo
Printer.add_token("bar")
printer.print
#foo
#bar不过,为了回答您的问题,可以使用class_eval和define_method重新定义其他类的方法
class Printer
def print
p '1'
end
end
module Test
def self.redefine_print(arg)
old_print = Printer.instance_method(:print)
Printer.class_eval do
define_method(:print) do
old_print.bind(self).call
p arg
end
end
end
end
printer = Printer.new
printer.print
# 1
Test.redefine_print("new stuff")
printer.print
# 1
# new stuff
Test.redefine_print("more")
printer.print
# 1
# new stuff
# morehttps://stackoverflow.com/questions/14944087
复制相似问题