我有以下变量
CONSTANT =5
我想测试常量如何在Ruby中工作,并且惊讶地发现以下内容:
CONSTANT = 6
..导致CONSTANT实际上被警告覆盖。我来自一个java背景,其中常量只是常量,因此我对Ruby如何完成事情感到有些困惑。
我的问题是,是否有办法模仿Ruby中的javas final关键字,从而不允许用户更改变量的值?
答案 0 :(得分:1)
就像Ruby中的很多东西一样,没有“最终”,事物本质上是动态的,绝对阻止人们做事永远不会发生。你可以让它变得困难。
要注意的一件事是在Ruby中, immutable 和 constant 之间存在差异。常量是一个变量,它会在重新分配时生成警告,这就是全部,并且没有什么可以阻止您修改它。为了防止修改,你必须“冻结”有问题的对象,尽管与Ruby中的所有内容一样,这只是对象可以忽略的请求。
通常你会看到这样的代码:
ADMIN_USER_TYPE = 'Admin'.freeze
或者这个:
USER_TYPES = %w[
Admin
].freeze
freeze
调用是为了捕获列表可能被某些方法意外破坏的情况。它并不能完全阻止这种情况,它更像是一种安全措施。请考虑以下代码:
def user_labels(types)
types.map! { |t| [ t, t.downcase.to_sym ] }
end
这里错误的map!
调用会产生重写原始数组的效果。如果您使用抛弃参数调用它,这很好:
user_labels(%w[ Admin Test ])
当你使用常量时,你将永久地修改它,这将导致它在每次被调用时反复修改,造成混乱。 freeze
标志在此处发出警告并阻止该警告。
所以简短的回答是:不。答案很长,你必须受到纪律处分,如果你有足够的决心,语言不会妨碍你这样做。注意警告并认真对待它们。