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