ホーム › エラー解決 › Ruby › FrozenError
Ruby ERROR

Ruby FrozenError の原因と解決法

freezeされた(凍結された)オブジェクトを変更しようとすると発生するエラーです。frozen_string_literalマジックコメントが原因のことも多いです。

このエラーメッセージ

FrozenError: can't modify frozen String

原因

❌ エラーになるコード

NG
name = "taro".freeze
name << "!"  # freeze済みの文字列は変更できない
puts name

✅ 修正したコード

OK
name = "taro".freeze
new_name = name + "!"  # 新しい文字列を作る
puts new_name

# 変更可能なコピーが必要なら dup
copy = name.dup
copy << "!"
puts copy
▶ 修正済みコードを実行エディタで開く
progoのRuby実行環境(インストール不要・登録不要)でその場で動作を確認できます。

解決のポイント

freezeされたオブジェクトは破壊的メソッド(<<・gsub!・upcase!など)で変更できません。新しいオブジェクトを作る(+やgsubなど!なしのメソッド)か、dupで変更可能なコピーを作って操作します。ファイル先頭に# frozen_string_literal: trueがあると、そのファイルの文字列リテラルはすべてfreeze状態になります。

よくある質問

frozen_string_literal: true は消していい?
パフォーマンスのために付けるのが近年の慣習です。消すより、変更が必要な文字列だけString.new("...")やdupで作る方が推奨されます。
freezeされているか確認するには?
str.frozen? がtrueを返すかどうかで確認できます。