Ruby如何重置类方法

Ruby如何重置类方法,ruby,Ruby,使用module_eval,我的代码允许我根据输入参数动态创建新方法并将其添加到类中。请参阅本文中的示例 现在我的问题是如何将类重置回其原始方法?有没有一个简单的方法可以用来将类重置回其原始状态?这样做的原因是,一旦新方法添加到类中,它们就会持续存在,如果我使用不同的方法集创建新对象,我需要摆脱它们 此外,如果这个问题不太合理,我必须道歉,我已经起床24小时了,可能需要休息一下,以便清楚地思考。如果这不清楚,我可以提供一个例子。提前谢谢你的帮助 我不知道有这样的工具,如果您需要,我可能会认为您

使用module_eval,我的代码允许我根据输入参数动态创建新方法并将其添加到类中。请参阅本文中的示例

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


此外,如果这个问题不太合理,我必须道歉,我已经起床24小时了,可能需要休息一下,以便清楚地思考。如果这不清楚,我可以提供一个例子。提前谢谢你的帮助

我不知道有这样的工具,如果您需要,我可能会认为您的代码可以更好地结构化,但您可以尝试以下几点:

  • 使用将引发异常或不执行任何操作的变体重写新方法。如果你知道新方法的名称,那就很容易做到。
  • 不要将方法添加到一个类中,而是创建一个从基类继承的匿名子类,将方法添加到基类中。(请参阅的答案以了解执行此操作的方法。)然后,您的基类仍然没有修改,因此无需重置它。

HTH

我会选择两种方法中的一种:

  • 将原始类方法移动到模块中,以后可以重新包含该模块
  • 或者对原始类的子类使用
    module\u eval
    ,当您想要重置时,只需获取一个新的子类
第二个比较容易:

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

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

编辑:添加了完整的解决方案

如果您保留了在先前帖子中添加的方法列表,您可以使用
remove\u 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
classmytest
@@方法列表=[]
def self.show_方法
@@方法列表
结束
def self.reset_方法
@@方法_list.each do |方法|
移除_方法(方法)
结束
@@方法列表=[]
结束
def self.add_方法
define_method(“method1”){puts“This is method1”}
define_method(“method2”){puts“This is method2”}
真的
结束
添加了定义自身方法(方法名称)
@@方法列表>需要“mytest.rb”
>>t=MyTest.new#=>#
>>MyTest.add_方法
添加:method1,列表:[“method1”]
添加:方法2,列表:[“方法1”,“方法2”]
>>t.method1#方法可用:
这是方法1
>>MyTest.reset\u方法
>>t.method1#方法现在未定义,因此我们预计会出现错误
NoMethodError:未定义的方法“method1”#
来自(irb):6

对于此解决方案,添加了一个方法(方法名称),您可以定义每次添加方法时都会调用该方法。我尝试了此方法,但出现了错误“ArgumentError:error number of arguments(2对1)”,很奇怪。结果表明,我的错误与使用module\u eval动态生成的方法有关,但在MyClass中没有显示,如果你用define_方法()来创建你的动态方法呢?remove_方法现在起作用了吗?我添加了一个完整的示例,包括使用Ruby 1.8.7I获得的输出,我同意。如果需要重置类,那么最好使用子类。如果要动态添加方法,请保持基类不被修改,并创建一个子类。
>> 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