Techioz Blog

ActiveSupport::Duration オブジェクトにはフリーズを使用する必要がありますか?

概要

期間を指定していくつかの定数を定義する場合

EXAMPLE_DAYS = 12.days

凍結されないでしょう

> EXAMPLE_DAYS.frozen?
false

そして、rubocop には対応するルールがありません。

そもそもそのようなオブジェクトの定数を凍結する必要があるのでしょうか?

解決策

それは定数に割り当てるオブジェクトのタイプによって異なります。 ActiveSupport::Duration のインスタンスの場合、変更を許可するパブリック ライター メソッドがないため、それを凍結することはあまり意味がありません。しかし、ルーボコップを喜ばせたいときは、それでもできます。

DAYS = 12.days.freeze
DAYS.frozen?
#=> true

たとえば文字列などの他のオブジェクトの場合は、固定しないと変更される可能性があり、通常は定数が変更されないようにしたいため、固定することは絶対に理にかなっています。

STRING = 'string'
STRING[1..4] = '----'
STRING
#=> "s----g"

しかし、冷凍すると:

STRING = 'string'.freeze
STRING[1..4] = '----'
#=> `[]=': can't modify frozen String: "string" (FrozenError)