使用module_eval,我的代码允许我根据输入参数动态创建和添加新方法。有关示例,请参阅此帖子 Ruby class_eval and yield
现在我的问题是如何将类重置回其原始方法?有没有一种简单的方法可以用来将类重置回原来的状态?这样做的原因是,一旦将新方法添加到类中,它们就会持续存在,如果我使用不同的方法集创建一个新对象,我需要摆脱它们。
如果这个问题没有意义,我必须道歉,我已经24小时了,可能需要休息才能清楚地思考。如果不清楚,我可以提供一个例子。感谢您的帮助。
答案 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)
我不知道这样的设施,如果您需要,我可能会认为您的代码可以更好地构建,但您可以尝试一些事项:
HTH