0

我有一个 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) }

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

4

1 回答 1

2

不不不。这太可怕了。对于初学者来说,今天尝试编写代码以明天接受完整的狗屎代码是错误的。你可以编写更容易理解、有点聪明、可扩展的代码,但不要因为试图编写比下一个开发人员更聪明的代码而陷入困境。

现在请回到绘图板。忘记你所知道的关于“插件”是什么的一切,忘记你曾经了解过的关于 PHP 或 C 或其他动态性较低的语言的一切。你有什么需求?您如何以一种适用于今天并且可以在明天扩展的方式解决它们?这样做,而不是更该死的事情。您是要为所有类使用全局命名空间编写代码,还是要将它们封装在以库命名的模块中以防止这种情况发生?

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

于 2012-07-31T02:43:57.447 回答