什么评论“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
# frozen_string_literal: true
是Ruby 2.3中第一次支持的魔术注释,它告诉Ruby文件中的所有string都被隐式冻结,就好像每一个都调用了#freeze
一样。 也就是说,如果一个string文字在这个注释中被定义在一个文件中,并且你调用了一个修改它的string的方法,例如<<
,你将得到RuntimeError: can't modify frozen String
。
评论必须在文件的第一行。
在Ruby 2.3中,您可以使用这个神奇的注释来准备在Ruby 3中默认的冻结string文字。
在Ruby 2.3中运行--enable=frozen-string-literal
标志,而在Ruby 3中,string文字在所有文件中都被冻结。 您可以使用# frozen_string_literal: false
覆盖全局设置。
如果你希望一个string文字是可变的而不pipe全局或者每个文件的设置如何,你可以用一元+
运算符(注意运算符的优先级)或者调用.dup
:
# frozen_string_literal: true "".frozen? => true (+"").frozen? => false "".dup.frozen? => false
你也可以用一元冻结一个可变的(解冻的)string。