2016-06-13 51 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是一個神奇的意見,支持首次用Ruby 2.3,它告訴紅寶石,該文件中的所有字符串文字隱含凍結,彷彿#freeze已經呼籲每個人。也就是說,如果字符串文字在具有此註釋的文件中定義,並且您在該字符串上調用了修改該字符串的方法,如<<,則會得到RuntimeError: can't modify frozen String

註釋必須位於文件的第一行。

在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 

您還可以凍結一個帶有一元-的可變(解凍)字符串。

+1

關於凍結字符串的重要事項是它[提高了應用程序的性能](https://bugs.ruby-lang.org/issues/8976#note-30)。另見[這裏](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

相關問題