rubyで定数を扱うならfreezeメソッドを使うべき

tl;dr

rubyでfreezeメソッドを使うとオブジェクトを変更不可な状態にできる

定数を扱う時はfreezeをつけておくといい

rubyのfreezeメソッド

rubyではfreezeと言うメソッドが定義されています

ref.xaio.jp

freezeメソッドを使うとオブジェクトを変更できない状態にすることができます

a = 'Heloo!!'
a.freeze
a.upcase!

=> FrozenError (can't modify frozen String)

メソッド自体は知ってたんですがいまいち使いどこがわからないなーって思ってたので調べてみました

そもそも定数はimmutableな方がいい

rubyでは定数は先頭を大文字にして表します

定数は名前の通り「定まった数」であり、一度決まったら変わらないのが普通です

同じファイルの中でなんども参照される文字列や配列などは定数として定義しておくといいです

定数はimmutableな方がいいと書きましたがimmutableは変更不可能な、mutableは変更可能なといった意味です

なので定数はimmutableな方がいいです (変更可能だと定まってないんで)

ただrubyの定数はmutableです

o'reillyの本の中でもこのように書かれています

www.oreilly.com

The Ruby interpreter does not actually enforce the constancy of constants

rubyinterpreter (人間が書いたコードを機械語に翻訳してくれるもの)は定数が変更不可な状態であることを保証しない

、、、定数とは。って感じしますね

rubyでは定数を先頭を大文字にして表現しますが、つまりはこんなことができちゃいます

NEW_CONSTANT = "foo"
NEW_CONSTANT << "bar"
puts NEW_CONSTANT

=> "foobar"

全然定まってないですね

定数は色々な場所から参照されるため、意図せず書き換えられてしまう可能性があります

なのでfreezeしておきましょう、って言う話でした

NEW_CONSTANT = "foo"
NEW_CONSTANT << "bar"

=> FrozenError (can't modify frozen String)

ちなみにRubyのversionが2.5より前だと RuntimeError: can't modify frozen String

2.5以上だと FrozenError (can't modify frozen String) になるそうです

参考資料

When to use freeze and frozen? in Ruby - Honeybadger Developer Blog

Rubyで定数を扱う場合はfreezeするべき - Qiita