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されると認識して良い。つまり、変更できな文字列が毎度定義されるということになる。

備考

ちなみに、文字列の変更と代入は全く別物でイミュータブルな変数に新しい値を代入して初期化することは可能である。それらは再代入できない値「定数」とは全く別物なのである。

 

藤沢瞭介(Ryosuke Hujisawa)
  • りょすけと申します。18歳からプログラミングをはじめ、今はフロントエンドでReactを書いたり、AIの勉強を頑張っています。off.tokyoでは、ハイテクやガジェット、それからプログラミングに関する情報まで、エンジニアに役立つ情報を日々発信しています!

未整理記事