2016-06-13 89 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

相关问题