Ruby中有'const指针'吗?

时间:2011-11-22 21:33:48

标签: ruby

已经在Ruby工作了一段时间,但通常在Rails的上下文中。我现在正在使用它来处理一些部署脚本,我发现自己正在寻找对不可变值的不可变引用。

在C ++中,我有(多年来我没有触及过C ++,所以请耐心等待)

const int x = 5;
const int * const i = &x;

这会给我一个变量i,它将永远指向5.我正在寻找一种方法来防止重新定义i。

在红宝石中,我有

i = 5.freeze

涵盖第一个const,但不包括第二个const。

i = 5
i = 6 # ideally generates an error or warning

这主要是为了帮助防守计划。有什么类似的吗?

(是的,这个问题的根本原因是我的脚本变得太大了,需要以一种主要的方式进行重构。这是在积压的。)

1 个答案:

答案 0 :(得分:1)

Ruby的"constants"在重新分配时会生成警告。并且,为了确保现有值不会发生变化,您可以冻结它们的值(就像您所做的那样)或者只是使用像Symbol这样的不可变值:

C:\>cat constant_reassignment.rb
FOO = :foo # Symbols are immutable, and a good choice for a sigil
FOO = :bar

C:\>ruby constant_reassignment.rb
constant_reassignment.rb:2: warning: already initialized constant FOO

如果您需要以编程方式定义值,可以在您选择的类/模块上使用const_set

class Foo; end
p Foo.const_defined? "BAR"  #=> false
p Foo::BAR rescue nil # Would be NameError: uninitialized constant Foo::BAR

Foo.const_set "BAR", 42
p Foo::BAR #=> 42

Foo.const_set "BAR", 17
#=> warning: already initialized constant BAR

如果您想要引发硬错误,我建议您创建一种方法来为您定义这些错误,并raise如果const_defined?显示已存在的值。