gpt4 book ai didi

ruby - Ruby 中有 'const pointer' 吗?

转载 作者:太空宇宙 更新时间:2023-11-03 16:35:38 25 4
gpt4 key购买 nike

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

在 C++ 中,我会(我已经多年没有接触 C++,所以请耐心等待)

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

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

在 ruby 中,我有

i = 5.freeze

它覆盖了第一个 const,但不包括第二个。

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

这主要是为了帮助进行防御性编程。有什么类似的吗?

(是的,这个问题的根本原因是我的脚本变得太大了,需要进行重大重构。它在积压中。)

最佳答案

鲁比的 "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

如果您想要引发硬错误,我建议您应该创建一个方法来为您定义这些错误,如果 const_defined? 显示这样的值已经存在,则引发

关于ruby - Ruby 中有 'const pointer' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8234115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com