ラックやレールなど、多くの有名なリポジトリからそのようなスタイルを簡単に見つけることができます。
たとえばラック内 :
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
なぜこれらの定数文字列がフリーズするのだろうか。これらはすべて定数であるため、インスタンスは1つだけにする必要があります。もちろん、同じシングルトンインスタンスを参照するために"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