# frozen_string_literal: true
是一个神奇的注释,在 Ruby 2.3 中首次支持,它告诉 Ruby 文件中的所有字符串文字都被隐式冻结,就好像#freeze
他们每个人都被叫过。也就是说,如果在带有此注释的文件中定义了字符串文字,并且您对该字符串调用修改它的方法,例如<<
, 你会得到RuntimeError: can't modify frozen String
.
冻结字符串可以防止因意外修改字符串而导致的错误,并且可以提高性能。
与任何魔术注释一样,frozen_string_literal 注释必须位于文件的第一个注释部分。 https://docs.ruby-lang.org/en/3.1/syntax/comments_rdoc.html#label-Magic+Comments讽刺的是,该 binstub 中的 freeze_string_literal 注释并不在 binstub 的第一个注释部分中,因此将被忽略。
In Ruby 2.3, you can use this magic comment to prepare for frozen string literals being the default in Ruby 3.
In Ruby 2.3 run with the --enable=frozen-string-literal
flag, and in Ruby 3, string literals are frozen in all files. You can override the global setting with # frozen_string_literal: false
.
如果您希望字符串文字是可变的,无论全局或每个文件设置如何,您可以在其前面加上一元前缀+
运算符(注意运算符优先级)或调用.dup
on it:
# frozen_string_literal: true
"".frozen?
=> true
(+"").frozen?
=> false
"".dup.frozen?
=> false
您还可以使用一元冻结可变(未冻结)字符串-
.
来源: ruby/ruby 中定义的 magic_comment https://github.com/ruby/ruby/blob/v3_0_0/parse.y#L8085-L8094