我有一个 ruby 脚本来获取plugin1.rb
并加载它。然后我会打电话run
并plugin1
做它的事情。
之后,我可能决定加载plugin2.rb
然后调用run
,然后plugin2
做它的事情。
这两个插件彼此无关,除了它run
为我提供了一种实际执行它们的方法,但它们可以根据需要定义它们的类和常量。
没有理由不存在类冲突之类的,所以我认为最好的办法是在插件完成运行后进行清理。
我应该如何编写我的 ruby 脚本,以便在它实际加载其中一个插件之前,它会正确清理上一个会话中的任何内容,以便为新脚本做好准备?
我想知道我需要删除哪些类型的东西,以及如何删除它们。
更新
环顾四周,我可以得到一个使用 定义的常量列表Object.constants
,其中包括所有已加载的类和模块。
所以我在想一些事情
# get start-up constants
initial_consts = Object.constants
# load a plugin
load "plugin1.rb"
# get new constants
new_consts = Object.constants - initial_consts
# run plugin
test = NewClass.new #defined in plugin
test.run
# clean-up new things
new_consts.each {|c| Object.send(:remove_const, c) }
这不会“还原”任何已更改的类,但我的设计阻止插件定义具有特定名称的类或方法,因此它不应该是一个太大的问题。