21.Ruby|frozen_string_literal
Rubyファイルの頭に下記のような記述があって、何となくスルーしてたけど改めて見るとこれってどういう役割なんやろ…?と疑問に思ったので整理。
# frozen_string_literal: true
まず前提として、Rubyの文字列はミュータブル・つまり破壊的な変更が可能なオブジェクトである。
ruby 2.3.0以降では、frozen_string_literalを使用することによりイミュータブル・つまりこの破壊的な変更を禁止にすることが可能に。
行頭に上記のようなマジックコメントを記述することで、ファイル中の文字を全て「freeze」できる。
または起動時のオプションで下記のように設定すれば、プロセス全体のデフォルト設定も可能。
--enable=frozen_string_literal
freeze
全ての文字列が「freeze」された状態では、下記のようなコードは「RuntimeError」となる。
# frozen_string_literal: true str = "a" str << "bc" p str # => test.rb:3:in `<main>': can't modify frozen String (RuntimeError)
dup
freezeを解除したい文字列に対しては、「dup」を使用して対応することも可能。
# frozen_string_literal: true str = "a".dup str << "bc" p str # => abc
+@
あるいは、下記のように書くことも可能。
# frozen_string_literal: true str = +"a" str << "bc" p str # => abc