Ruby:注释“frozen_string_literal: true”有什么作用?

2024-05-04

这是rspecbinstub 在我的项目目录中。

#!/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 文件中的所有字符串文字都被隐式冻结,就好像#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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby:注释“frozen_string_literal: true”有什么作用? 的相关文章

随机推荐

  • 根据纬度和经度识别哪个是多边形

    我有一张使用 leaflet js 绘制的地图 如果我给出经度和纬度值作为输入 我可以识别多边形吗 我可以获得一个客户端脚本吗 得到答复如下 这是基于 多边形中的点算法 function getPoint float x 89 824218
  • 使用 Angular UI Bootstrap 在动态创建的选项卡上设置活动选项卡

    我有一个动态选项卡集 它从一个以空白开始的数组生成选项卡 当我向数组添加新项目时 它会显示为新选项卡 我希望最后添加的选项卡成为活动选项卡 每次向数组添加项目时我都会设置活动索引 HTML
  • 如何在Python中用turtle在下一行写入

    for i in range 0 len all keys if i 4 break elem dict1 all keys i output elem str all keys i print output write output fo
  • Windows 10 关闭、最小化和最大化按钮

    要绘制主题按钮 我使用以下代码 var h HTHEME begin if UseThemes then begin SetWindowTheme Handle explorer nil h OpenThemeData Handle WIN
  • 部署在aws上时如何使用环境变量

    我正在构建一个在本地利用环境变量的 Web 应用程序 我想将其投入生产 在线 我正在尝试了解如何在 AWS 上设置环境变量 这是一个 Node js 应用程序 我在 AWS 上使用 Elastic beanstalk 进行部署 我已经看过了
  • 将具有联合字段的 C 结构映射到 Go 结构

    我从 Go 中的某些 WinApi 的系统调用中获取结果 我可以轻松地从 C 代码映射简单的结构 但是如何处理如下所示的 C 结构 typedef struct SPC LINK DWORD dwLinkChoice define SPC
  • 如何使用 zend paginate 而不加载数据库的所有结果

    所以我认为 zend paginate 工作的方式是 paginator Zend Paginator factory results paginator gt setItemCountPerPage itemCount paginator
  • C++ const 左值引用

    假设我有 A 类不可复制 类 B 具有 const A a 作为成员 并在其构造函数中采用 A 并将其设置在其初始化列表中 一个函数A GenerateA 这是否意味着执行以下操作应该有效 B 生成A 即 const ref 是否意味着ge
  • 为什么 SDL 在 Mac 上比 Linux 上慢得多?

    我正在研究使用 SDL2 渲染的单线程图形程序 https github com TurkeyMcMac intergrid 请参阅末尾的较小示例 它既可以在旧的 Linux 机器上运行 也可以在不太旧的 Mac 上运行 Linux 计算机
  • Cocos2d:CCSpriteBatch 节点是否仅绘制可见属性设置为 true 的精灵?

    CCSpriteBatch 节点是否仅绘制可见属性设置为 true 的精灵 或者它也考虑屏幕尺寸 换句话说 如果节点内的精灵位于屏幕之外 opengl 绘制调用的性能是否会反映这一点 不 不 CCSpriteBatchNode 始终绘制所有
  • 多处理中的共享内存

    我有三个大清单 第一个包含位数组 模块位数组 0 8 0 另外两个包含整数数组 l1 bitarray 1 bitarray 2 bitarray n l2 array 1 array 2 array n l3 array 1 array
  • mysql 时钟

    我有一个包含以下元素的时钟表 id pk action emp id fk time 如果我通过了 如何选择最新的动作emp id到查询 id emp id action current time 1 1 clockin 2012 01 2
  • IE9 是否支持 CSS3 ::before 和 ::after 伪元素?

    On 这个 MS 兼容性表 http msdn microsoft com en us library cc351024 28v vs 85 29 aspx它说 IE9不支持伪元素 before and after 但当我尝试时 似乎确实
  • 将数据作为 RDD 保存回 Cassandra

    我试图从 Kafka 读取消息 处理数据 然后将数据添加到 cassandra 中 就像它是 RDD 一样 我的麻烦是将数据保存回 cassandra 中 from future import print function from pys
  • 使用基类活动将多个活动(选项卡)绑定到服务

    发帖后发现这些 http code google com p android issues detail id 2665 http code google com p android issues detail id 2665http co
  • Javascript时间转换正则表达式

    我有一种使用 Net 中的正则表达式来转换时间的方法 例如 1h 20m 格式为双倍 就这个 public static double GetTaskHours this string tmpHours Double taskHours 0
  • 在 Pygame 中缩放图像/矩形

    是否可以在 pygame txt 内部 缩放 矩形 有点像当你在桌面上缩放窗口时 我想知道你如何在 pygame 中做到这一点 您的光标将控制矩形的大小 我使用 skrx 方法并尝试对 2 个矩形执行此操作 if evnt type MOU
  • Facebook应用程序白名单流程

    有谁知道将 FB 应用程序列入白名单以启用某些功能的过程吗 我看到很少有人问同样的问题 但没有答案 FB 有处理白名单申请的联系人吗 没有申请白名单的公共流程 与大多数公司一样 Facebook 可能拥有少量私有 API 这些 API 仅供
  • pandas - 将字符串转换为字符串列表[重复]

    这个问题在这里已经有答案了 我有这个 file csv 文件可以用 pandas 读取 Title Tags T1 Tag1 Tag2 T1 Tag1 Tag2 Tag3 T2 Tag3 Tag1 using df pd read csv
  • Ruby:注释“frozen_string_literal: true”有什么作用?

    这是rspecbinstub 在我的项目目录中 usr bin env ruby begin load File expand path spring FILE rescue LoadError end frozen string lite