首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让一个方法重新定义另一个类的方法

让一个方法重新定义另一个类的方法
EN

Stack Overflow用户
提问于 2013-02-19 03:44:07
回答 1查看 41关注 0票数 0

我有一个简单的类和一个简单的方法定义

代码语言:javascript
复制
class Printer
  def print
    p '1'
  end
end

现在,我介绍了一个单独的脚本,它通过向print添加一些额外的东西来重新定义print方法

代码语言:javascript
复制
class Printer

  alias :old_print :print
  def print
    old_print
    p '2'
  end
end

我能以编程的方式做到这一点吗?

代码语言:javascript
复制
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

因此,示例交互可能如下所示

代码语言:javascript
复制
>>>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实例,执行其打印,然后立即释放)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-19 04:01:19

您可以使用define_method或一个模块来实现这一点,但是这样做太过分了(而且可能非常慢)。可以(也更简单)使用类变量和类方法:

代码语言:javascript
复制
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_evaldefine_method重新定义其他类的方法

代码语言:javascript
复制
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
# more
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14944087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档