删除所有加载的定义和常量

时间:2012-07-31 00:29:58

标签: ruby

我有一个ruby脚本需要plugin1.rb并加载它。然后我会致电runplugin1会做出自己的事情。

之后,我可能决定加载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) }

这不会“还原”任何已更改的类,但我的设计会阻止插件使用某些名称定义类或方法,因此它不应该是一个太大的问题。

1 个答案:

答案 0 :(得分:2)

不,不,不。这是可怕的。对于初学者来说,今天尝试编写代码是错误,目标是明天接受完整的狗屎代码。你可以编写更容易理解的代码,这有点聪明,并且可以扩展,但是不要试图编写应该比下一个开发人员更聪明的代码。

现在请回到绘图板。忘掉你所知道的关于什么是“插件”的一切,以及你所学到的关于PHP或C或其他动态性较弱的语言的一切。你有什么需求?你怎么能以今天有效的方式解决它们,明天可以延长?那样做,不是一个该死的东西。您是要使用全局命名空间为所有类编写代码,还是要将它们封装在以库命名的模块中以防止这种情况?

您可以使用各种工具来锁定环境,例如Clean Rooms,但我认为您甚至不需要这些工具。我认为你真的只需要放弃尝试编写代码以满足模糊需求,并实现处理各种可能性的雄心勃勃的目标。