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 を使用して、変更可能な (凍結されていない) 文字列を凍結することもできます-
。