1. ホーム
  2. ルビー

[解決済み】Ruby: frozen_string_literal: true" というコメントは何を意味しているのでしょうか?

2022-03-27 14:27:23

質問

これは rspec のbinstubをプロジェクトディレクトリに置いています。

#!/usr/bin/env ruby
begin
  load File.expand_path("../spring", __FILE__)
rescue LoadError
end
# frozen_string_literal: true
#
# This file was generated by Bundler.
#
# The application 'rspec' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require "pathname"
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
  Pathname.new(__FILE__).realpath)

require "rubygems"
require "bundler/setup"

load Gem.bin_path("rspec-core", "rspec")

これは何を意図しているのでしょうか?

# frozen_string_literal: true

解決方法は?

# frozen_string_literal: true は、Ruby 2.3 で初めてサポートされたマジックコメントで、ファイル内のすべての文字列リテラルを暗黙のうちに凍結することを、あたかも #freeze がそれぞれ呼び出されました。つまり、ある文字列リテラルがこのコメント付きのファイルで定義されており、その文字列を変更するメソッド、例えば << と表示されます。 RuntimeError: can't modify frozen String .

コメントは、ファイルの先頭行に記述する必要があります。

Ruby 2.3では、このマジックコメントを使用することができます。 Ruby 3 のデフォルトである凍結文字列リテラルに対応するために .

Ruby 2.3では --enable=frozen-string-literal フラグを使用します。 で、Ruby3では 文字列リテラルは、すべてのファイルで凍結されます。グローバルな設定をオーバーライドするには # frozen_string_literal: false .

文字列リテラルをグローバルまたはファイルごとの設定に関係なく変更可能にしたい場合、その前に単項の + 演算子(演算子の優先順位に注意)または .dup を追加しました。

# frozen_string_literal: true
"".frozen?
=> true
(+"").frozen?
=> false
"".dup.frozen?
=> false

また、ミュータブルな(凍結されていない)文字列を凍結するには、単項の - .