Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 是否有一个';常量指针';用红宝石?_Ruby - Fatal编程技术网

Ruby 是否有一个';常量指针';用红宝石?

Ruby 是否有一个';常量指针';用红宝石?,ruby,Ruby,已经在Ruby中工作了一段时间,但通常是在Rails环境中。我现在将它用于一些部署脚本,我发现自己正在寻找一个不可变值的不可变引用 在C++中,我已经(我没有接触C++多年了,所以请容忍我) 这会给我一个变量,永远指向5。我正在寻找一种防止重新定义I的方法 在ruby,我有 i = 5.freeze 它包括第一个常数,但不包括第二个常数 i = 5 i = 6 # ideally generates an error or warning 这主要是为了帮助项目防御。有类似的吗 (是的,这个问

已经在Ruby中工作了一段时间,但通常是在Rails环境中。我现在将它用于一些部署脚本,我发现自己正在寻找一个不可变值的不可变引用

在C++中,我已经(我没有接触C++多年了,所以请容忍我)

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

在ruby,我有

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
If
const\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