Ruby如何重置类方法

时间:2010-01-11 13:18:41

标签: ruby

使用module_eval,我的代码允许我根据输入参数动态创建和添加新方法。有关示例,请参阅此帖子 Ruby class_eval and yield

现在我的问题是如何将类重置回其原始方法?有没有一种简单的方法可以用来将类重置回原来的状态?这样做的原因是,一旦将新方法添加到类中,它们就会持续存在,如果我使用不同的方法集创建一个新对象,我需要摆脱它们。

如果这个问题没有意义,我必须道歉,我已经24小时了,可能需要休息才能清楚地思考。如果不清楚,我可以提供一个例子。感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

修改:添加了完整的解决方案

如果您保留早期帖子中添加的方法列表,则可以使用remove_method删除这些方法,例如:

class MyTest
  @@methods_list = []

  def self.show_methods
    @@methods_list
  end

  def self.reset_methods
    @@methods_list.each do |method|
      remove_method(method)
    end
    @@methods_list = []
  end

  def self.add_methods
    define_method("method1")  { puts "This is method1" }
    define_method("method2")  { puts "This is method2" }
    true
  end

  def self.method_added(method_name)
    @@methods_list << method_name.to_s
    puts "Added: " + method_name.to_s + ", list: " + @@methods_list.inspect
  end
end

现在您可以试用以下内容:

>> require 'mytest.rb'
>> t = MyTest.new # => #<MyTest:0x2b1e293247f0>
>> MyTest.add_methods
Added: method1, list: ["method1"]
Added: method2, list: ["method1", "method2"]
>> t.method1 # Method is available:
This is method1
>> MyTest.reset_methods
>> t.method1 # Method is undefined now, so we'd expect an error
NoMethodError: undefined method `method1' for #<MyTest:0x2b1e293247f0>
    from (irb):6

答案 1 :(得分:1)

我会采取两种方法之一:

  • 将原始类方法移动到模块,您可以稍后重新include
  • 或在原始类的子类上使用module_eval,并在想要重置时获取新的子类。

第二个更容易做:

 subklass = Class.new(MyAwesomeClass)
 subklass.module_eval #...

 # ok, I'm done, I want to reset
 subklass = Class.new(MyAwesomeClass)

答案 2 :(得分:0)

我不知道这样的设施,如果您需要,我可能会认为您的代码可以更好地构建,但您可以尝试一些事项:

  • 使用会引发异常的变体覆盖新方法,或者什么都不做。如果你知道新方法的名称,那就很容易了。
  • 不是向一个类添加方法,而是创建一个继承自基类的匿名子类,您可以向其添加方法。 (请参阅this question的答案以获取此操作的方法。)然后,您的基类仍未修改,因此无需重置它。

HTH