为什么我可以改变常量?

时间:2012-01-17 12:53:32

标签: ruby

class TestClass
  CONSTANT = 1
end

TestClass::CONSTANT = 2

显然你可以随时更改Ruby中常量的值。如果你能改变它们,为什么它们甚至被称为“常数”?

这些'常数'的目的是什么?改变价值的能力如何使编程更容易?

1 个答案:

答案 0 :(得分:6)

嗯,Ruby中的常量是相对可变的。它们指向的对象可以交换(如在您的示例中),并且它们的状态也可以更改。

class TestClass
  Constant = []
end
TestClass::Constant << "no warning at all!"

它们提供的唯一优势是当您将现有常量指向另一个对象时生成的警告。见"Programming Ruby", section "Variables and Constants"。它虽旧但仍然有效。

Ruby常量存在的目的是发出不应更改给定引用的信号。例如,如果你做Math::PI = 3.0,你应该受到警告。

理论上,您可以破坏与原始实现的兼容性并强制执行常量的不变性。因此,通过优化方法调度,您可以实现轻微的性能提升。

在上面的示例中,您知道Constant.is_a? Array因此,在第一次执行该行时,只能将<<符号调度到实际方法一次。问题是Ruby允许您重新定义Array#<<,从而使问题更加棘手。

检查各种Ruby实现是否尝试使用此类优化需要进行一些额外的研究并挖掘其文档或来源。