Ruby 是否有一个';常量指针';用红宝石?
已经在Ruby中工作了一段时间,但通常是在Rails环境中。我现在将它用于一些部署脚本,我发现自己正在寻找一个不可变值的不可变引用 在C++中,我已经(我没有接触C++多年了,所以请容忍我) 这会给我一个变量,永远指向5。我正在寻找一种防止重新定义I的方法 在ruby,我有Ruby 是否有一个';常量指针';用红宝石?,ruby,Ruby,已经在Ruby中工作了一段时间,但通常是在Rails环境中。我现在将它用于一些部署脚本,我发现自己正在寻找一个不可变值的不可变引用 在C++中,我已经(我没有接触C++多年了,所以请容忍我) 这会给我一个变量,永远指向5。我正在寻找一种防止重新定义I的方法 在ruby,我有 i = 5.freeze 它包括第一个常数,但不包括第二个常数 i = 5 i = 6 # ideally generates an error or warning 这主要是为了帮助项目防御。有类似的吗 (是的,这个问
i = 5.freeze
它包括第一个常数,但不包括第二个常数
i = 5
i = 6 # ideally generates an error or warning
这主要是为了帮助项目防御。有类似的吗
(是的,这个问题的根本原因是我的脚本太大了,需要以主要方式进行重构。它在待办事项列表中。)Ruby在重新分配时会生成警告。而且,为了确保现有值不会发生变异,您可以冻结它们的值(就像您所做的那样),或者简单地使用不可变的值,如符号:
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
如果需要以编程方式定义可在所选类/模块上使用的值:
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
Ifconst\u defined?
显示这样一个已经存在的值。我将它用于运行时生成/返回的值,但不是预先已知的值。这感觉很不自然。这可能是唯一的办法。这只会让我的代码看起来“不太好”。@JohnHinnegan我编辑了我的答案,以展示如何动态定义一个常量,并在已经定义的情况下得到警告。
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