【Ruby】RuboCopのFrozenStringLiteralCommentについて

スポンサーリンク

Ruby のバージョンを 2.3 にあげて  RuboCop を実行するとMissing frozen string literal comment.の警告がでるようになりました。

RuboCopの実行結果

.rubocop.ymlTargetRubyVersion: 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