Ruby和Java的final关键字中的常量

时间:2016-06-14 00:09:11

标签: java ruby constants final

我有以下变量

CONSTANT =5 

我想测试常量如何在Ruby中工作,并且惊讶地发现以下内容:

CONSTANT = 6

..导致CONSTANT实际上被警告覆盖。我来自一个java背景,其中常量只是常量,因此我对Ruby如何完成事情感到有些困惑。

我的问题是,是否有办法模仿Ruby中的javas final关键字,从而不允许用户更改变量的值?

1 个答案:

答案 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标志在此处发出警告并阻止该警告。

所以简短的回答是:不。答案很长,你必须受到纪律处分,如果你有足够的决心,语言不会妨碍你这样做。注意警告并认真对待它们。