gpt4 book ai didi

java - Ruby 中的常量和 Java 的 Final 关键字

转载 作者:行者123 更新时间:2023-11-30 07:19:35 24 4
gpt4 key购买 nike

我有以下变量

CONSTANT =5 

我想测试常量在 Ruby 中的工作原理,并惊讶地发现以下内容:

CONSTANT = 6

..导致 CONSTANT 实际上被警告覆盖。我有 java 背景,常量就是常量,因此我对 Ruby 如何完成事情有点困惑。

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

最佳答案

就像 Ruby 中的很多事情一样,没有“最终的”,事情本质上是动态的,绝对阻止人们做事情永远不会真正发生。你可以让它变得困难。

需要注意的一件事是,在 Ruby 中,不可变常量 之间存在差异。常量是一个变量,在重新分配时会生成警告,仅此而已,并且没有什么可以阻止您修改它。为了防止修改,您必须“卡住”相关对象,尽管与 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 标志会在此处发出警告并防止这种情况发生。

所以简短的答案是:不。长的答案是你必须遵守纪律,如果你有足够的决心,语言不会阻止你这样做。注意警告并认真对待。

关于java - Ruby 中的常量和 Java 的 Final 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801025/

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