ruby-on-rails - 为什么到处都是卡住的常量?

标签 ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 rack

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

For example in rack :

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

Another examle in rails :

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_SINCE 这样的文字变量名。

所以在我看来,尽管使用 #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"

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

> FOO = 'foo'.freeze
> FOO[1] = '-'
# => RuntimeError: can't modify frozen String

关于ruby-on-rails - 为什么到处都是卡住的常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27702540/

相关文章:

ruby-on-rails - 在 Mac 和 Linux 机器上创建等效的 Rails 工作区

ruby-on-rails - 使用 websokets-rails gem 每秒广播消息

ruby-on-rails-3 - 用于自定义操作的 rails3 cancan load_resource

ruby-on-rails - Excon::Errors::Forbidden (Expected(200) <=> Actual(403 Forbidden)

ruby-on-rails - 如何一步建立一个带有子工厂的父工厂以通过验证

ruby - 如何在centos或ruby docker容器中运行ruby gem?

ruby-on-rails - rails 3 : alias_method_chain still used?

windows - Rails-MiniMagick 命令不起作用

ruby-on-rails-3 - Rails 3:HTTP_USER_AGENT

ruby-on-rails-3 - Backbone.js 集合 url