Ruby: コメント「frozen_string_literal: true」は何をしますか? 質問する

Ruby: コメント「frozen_string_literal: true」は何をしますか? 質問する

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

ベストアンサー1

# frozen_string_literal: trueは、Ruby 2.3 で初めてサポートされたマジックコメントで、ファイル内のすべての文字列リテラルが、#freezeそれぞれに対して が呼び出されたかのように暗黙的に凍結されていることを Ruby に伝えます。つまり、このコメントを含むファイルで文字列リテラルが定義され、その文字列に対して などのメソッドを呼び出してそれを変更すると、 が<<返されますRuntimeError: can't modify frozen String

文字列をフリーズすると、意図せずに誤って文字列を変更することで発生するバグを防ぎ、パフォーマンスが向上する可能性があります。

他のマジックコメントと同様に、frozen_string_literal コメントはファイルの最初のコメント セクションに配置する必要があります。皮肉なことに、その binstub 内の freeze_string_literal コメントは binstub の最初のコメント セクションにないため、無視されます。

Ruby 2.3 では、このマジックコメントを使用して、 Ruby 3 でデフォルトとなる固定文字列リテラルに備えること ができます。

Ruby 2.3 では--enable=frozen-string-literalフラグを付けて実行し、 Ruby 3 では 文字列リテラルはすべてのファイルで固定されます。 でグローバル設定を上書きできます# frozen_string_literal: false

グローバルまたはファイルごとの設定に関係なく、文字列リテラルを変更可能にしたい場合は、単項+演算子をプレフィックスとして付けるか(演算子の優先順位に注意してください)、.dup次のように呼び出します。

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

unary を使用して、変更可能な (凍結されていない) 文字列を凍結することもできます-

出典: ruby​​/ruby で定義された magic_comment

おすすめ記事