Ruby のバージョンを 2.3 にあげて RuboCop を実行するとMissing frozen string literal comment.
の警告がでるようになりました。
RuboCopの実行結果
.rubocop.yml
にTargetRubyVersion: 2.3
を指定して実行すると以下の警告がでます。
$ bundle exec rubocop Inspecting 5 files CCCCC Offenses: config.ru:1:1: C: Missing frozen string literal comment. # This file is used by Rack-based servers to start the application. ^ Rakefile:1:1: C: Missing frozen string literal comment. # Add your own tasks in files placed in lib/tasks ending in .rake, ^ app/controllers/application_controller.rb:1:1: C: Missing frozen string literal comment. class ApplicationController < ActionController::Base ^ ...
警告の原因
Ruby 2.3 から# frozen_string_literal: true
というマジックコメントを使用すると、文字列リテラルがデフォルトでfreeze
されるようになりました。これは Ruby 3.0 では文字列リテラルがデフォルトで freeze (=不変) になる予定なので、互換性の問題もあり移行シュミレーションが可能なように導入されています。
# frozen_string_literal: true str = "HOGE" str.downcase!
$ ruby test.rb test.rb:3:in `downcase!': can't modify frozen String (RuntimeError) from test.rb:3:in `<main>'
Ruby2.3.0 の新機能 - rochefort's blog
対応方法
回避方法としては警告の出たファイルに# frozen_string_literal: true
コメントを追加するか.rubocop.yml
に以下を追加することで対応可能です。
Style/FrozenStringLiteralComment: Enabled: false
$ bundle exec rubocop Inspecting 5 files ..... 5 files inspected, no offenses detected