2016-06-13 3 views
60

これは私のプロジェクトディレクトリにあるrspec binstubです。コメント "frozen_string_literal:true"は何をしますか?

#!/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 

答えて

86

# frozen_string_literal: true#freezeがそれらのそれぞれの上に呼び出されたかのように、ファイル内のすべての文字列リテラルは暗黙のうちに、凍結されていることルビーを告げるのRuby 2.3で初めてサポート魔法のコメント、です。つまり、このコメントを持つファイルに文字列リテラルが定義されていて、その文字列を変更するメソッド(たとえば、<<)を呼び出すと、RuntimeError: can't modify frozen Stringが返されます。

コメントはファイルの最初の行にある必要があります。

は、Ruby 2.3では、あなたは--enable=frozen-string-literalフラグでのRuby 2.3の実行には

は、ルビー3で、文字列リテラルは、中で凍結されている3 Rubyで既定されて凍結された文字列リテラルの準備のために、この魔法のコメントを使用することができますすべてのファイル。グローバル設定を# frozen_string_literal: falseで上書きすることができます。

あなたは関係なく、グローバルまたはファイルごとの設定の変更可能なことは、文字列リテラルたい場合は、単項+演算子(演算子の優先順位を持つように注意して)を前に付けたり、それに.dupを呼び出すことができます。

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

変更可能な(フリーズしていない)文字列を単体の-でフリーズすることもできます。

+1

文字列のフリーズに関する重要なことは、[アプリケーションのパフォーマンスを向上させる]ことです(https://bugs.ruby-lang.org/issues/8976#note-30)。また、[here](https://blog.lucascaton.com.br/2016/01/19/what-is-frozen_string_literal-in-ruby/)も参照してください。 –

+2

@ dave-schweisguth ' - " foo " '' foo ".freeze'と同じにする? '( - " foo ").__ id__'をチェックすると毎回違う値が得られますが、foo" .freeze .__ id__ "は毎回同じです。何か案は? – lilole

+0

この関数が問題であるかどうかは、単項マイナスでのみ呼び出されるようです。 https://github.com/ruby/ruby/blob/trunk/string.c#L2572 – lilole

関連する問題