
Rubyのfrozen_string_literalを理解する
Railsのソースを見てたら下記のようなコードを見つけた。
# frozen_string_literal: true
これは一体なんなんだろうかと感じググって調べてみたらわかったので今日はこの # frozen_string_literal: true
について書き残しておく。
ミュータブルとイミュータブル
そもそも変数にはミュータブルとイミュータブルな変数がある。これは、変数の中の値が変更可能か、もしくは不可能かの違いである。Rubyで例えると、以下のようなバージョンの場合、以下のように文字列を変更することができる。つまり、これはミュータブルな値と言える。
# ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
str = "a"
=> "a"
str << "bc"
=> "abc"
しかし、仮に下記のように変数をイミュータブル(変更できない)な値に変えることがRubyではできる。.freeze をすることで、文字列の変数をイミュータブル(変更できない)な値に変えることができた。
str = "a".freeze
=> "a"
str << "bc"
Traceback (most recent call last):
1: from (irb):12
FrozenError (can't modify frozen String)
結論
結論
結論として、Railsのファイルの先頭に
# frozen_string_literal: true
があるときは、ファイル全体の文字列が frozen
されると認識して良い。つまり、変更できな文字列が毎度定義されるということになる。
備考
ちなみに、文字列の変更と代入は全く別物でイミュータブルな変数に新しい値を代入して初期化することは可能である。それらは再代入できない値「定数」とは全く別物なのである。