Редактировать: Добавлено полное решение
Если вы храните список методов, добавленных в предыдущем посте, вы можете использовать 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