我有一个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) }
这不会“还原”任何已更改的类,但我的设计会阻止插件使用某些名称定义类或方法,因此它不应该是一个太大的问题。
答案 0 :(得分:2)
不,不,不。这是可怕的。对于初学者来说,今天尝试编写代码是错误,目标是明天接受完整的狗屎代码。你可以编写更容易理解的代码,这有点聪明,并且可以扩展,但是不要试图编写应该比下一个开发人员更聪明的代码。
现在请回到绘图板。忘掉你所知道的关于什么是“插件”的一切,以及你所学到的关于PHP或C或其他动态性较弱的语言的一切。你有什么需求?你怎么能以今天有效的方式解决它们,明天可以延长?那样做,不是一个该死的东西。您是要使用全局命名空间为所有类编写代码,还是要将它们封装在以库命名的模块中以防止这种情况?
您可以使用各种工具来锁定环境,例如Clean Rooms,但我认为您甚至不需要这些工具。我认为你真的只需要放弃尝试编写代码以满足模糊需求,并实现处理各种可能性的雄心勃勃的目标。