为什么到处都有冻结常数?

2024-04-30

我们可以很容易地从许多著名的存储库中找到这种样式,例如机架、导轨等。

例如在机架中 https://github.com/rack/rack/blob/28e77c710ac2ddb35c436d78d72e28f28f964446/lib/rack.rb:

PATH_INFO      = 'PATH_INFO'.freeze
REQUEST_METHOD = 'REQUEST_METHOD'.freeze
SCRIPT_NAME    = 'SCRIPT_NAME'.freeze
QUERY_STRING   = 'QUERY_STRING'.freeze
CACHE_CONTROL  = 'Cache-Control'.freeze
CONTENT_LENGTH = 'Content-Length'.freeze
CONTENT_TYPE   = 'Content-Type'.freeze

:

HTTP_IF_MODIFIED_SINCE = 'HTTP_IF_MODIFIED_SINCE'.freeze
HTTP_IF_NONE_MATCH     = 'HTTP_IF_NONE_MATCH'.freeze
HTTP_IF_NONE_MATCH     = 'HTTP_IF_NONE_MATCH'.freeze

我想知道为什么这些常量字符串被冻结。由于它们都是常量,因此应该只有一个实例。当然我们可以把"foo".freeze在某个地方引用相同的单例实例,但是人们通常会写文字变量名称,例如HTTP_IF_MODIFIED_SINCEinstead.

所以在我看来,尽管使用它没有任何区别#freeze,那么为什么人们要冻结常数呢?


当您将值重新分配给已初始化的常量时,Ruby 会打印警告,这是正确的:

FOO = 'foo'
FOO = 'bar'
# :2: warning: already initialized constant FOO
# :1: warning: previous definition of FOO was here
FOO
#=> "bar"

但是没有任何保护措施可以防止常量值的某些部分发生变化。没有的例子freeze:

FOO = 'foo'
FOO[1] = '-'
FOO
#=> "f-o"

But freeze允许保护常量的值不被更改。示例为freeze:

FOO = 'foo'.freeze
FOO[1] = '-'
#=> RuntimeError: can't modify frozen String
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么到处都有冻结常数? 的相关文章

随机推荐