是否可以在ruby中取消定义变量?

在ruby中,有没有办法在定义变量或常量后“取消定义”?

在我们的轨道环境中,我们根据环境定义三种含量中的一种: TESTINGDEVELOPMENTPRODUCTION 。 那么,在控制器代码中,我们使用defined? 看看我们所处的环境,即: defined? PRODUCTION defined? PRODUCTION

现在,我想对一些特定于环境的行为进行unit testing。 我最初的尝试是在我的测试中设置适当的常量,然后在拆解时重置它们。 但是,我无法弄清楚如何重置DEVELOPMENTPRODUCTION这样的defined? 返回false。

显然,一个解决方案是只检查是否适当的常量也是真的,除了检查它是否已定义,但这将导致必须触及相当数量的现有代码。

编辑:我意识到这绝对不是正确的做事方式。 唉,改变它是一项非常重要的任务,所以我正在寻找一种简单的方法来单独测试现在的情况。 另外,我也很好奇关于是否有可能取消定义变量/常数的低级语言问题。

我找到了这个答案

 Object.send(:remove_const, "TESTING") 

如果我没记错的话,在这里使用send是一种hack,因为remove_const实际上是一个私有方法。 你想问问自己为什么你需要在它们真正相互排斥的同时定义常量生产,开发和测试; 这就是为什么我赞成grepsedawk的答案。

嗯,我猜测因为这是用RubyOnRails标记的,我们在这里谈论Rails ……环境已经存储在RAILS_ENV中,所以做了类似的工作……

 if (RAILS_ENV == "production") ... 

我想你也可以这样写:

 RAILS_ENV.include?("development") 

对于互斥的条件使用三个真/假变量没有多大意义。 例如,如果同时设置了DEVELOPMENT和PRODUCTION,会发生什么。

相反,有一个变量指示您所处的环境,将ENVIRON设置为其中一个集合( DEVTESTPROD )或类似的东西。

然后,您可以将ENVIRON与您要执行的每个操作的三个中的一个进行比较。

而不是检查每个常量,为什么不做这样的事情:

 environment = :TESTING if(environment == :TESTING)