Ruby 符号的存在是因为字符串是可变的且不可保留的吗?

2023-12-24

我使用 Ruby 已经大约一年了,有一个语言问题:符号是否是必要的,因为 Ruby 字符串是可变的且不被保留?

例如,在 Java 中,字符串是不可变的且被保留的。所以“foo”在值和引用上总是等于“foo”,并且它的值不能改变。在 Ruby 中,字符串是可变的并且不能被保留,所以"a".object_id == "a".object_id将会是假的。

如果 Ruby 像 Java 一样实现了字符串,那么就不需要符号了,对吧?


从 Ruby 2.3 开始不可变String已可选地通过以下方式实现RUBYOPT flag --enable-frozen-string-literals i.e.

RUBYOPT=--enable-frozen-string-literals ruby /some/file

这将导致所有String文字(使用创建的字符串"", %q{}, %Q{},或“#{}”样式)变得不可变。该功能目前被认为是 Ruby 3.0 的默认功能。按照功能#11473 进行操作 https://bugs.ruby-lang.org/issues/11473。此功能还可以在文件级别而不是全局级别上作为“神奇注释”使用

# frozen_string_literal: true

这将产生与RUBYOPT版本但仅适用于特定文件。 (另一种方法是直接与虚拟机交互RubyVM::InstructionSequence.compile_option = {frozen_string_literal: true})

由于这是可选的,显然它可以打开和关闭,并且仍然是 3.0 中的一个选项,只是默认为打开而不是关闭。可变的Strings 仍然可以使用创建String.new和不可变的String可以是duped 使他们的dup对应部分可变。 (请注意上面:插值"#{}"还创建了一个新的不可变字符串,因为"")

话虽如此,它并不能取代Symbols在红宝石中。首先是底层C为红宝石杠杆提供动力Symbols大量通过rb_itern处理方法定义等内容的引用(这些内容的标题为《不朽的符号》并且永远不会被GCed)。

此外Symbols就像 ruby​​ 中的所有东西都是它们自己的一样Object并拥有自己有用的功能集。拿Symbol#to_proc例如。这最初是一个猴子补丁解决方案,旨在简化语法,并在 1.8.7 中被消耗到核心中。这种风格受到整个 Ruby 社区的高度鼓励和定期利用。请告知您如何建议将此功能降级与String代替Symbol.

While Symbols由于它们的驻留和内存消耗与红宝石的动态相结合,曾经被认为有些“危险”(因为没有更好的词)。从 Ruby 2.2 开始,大多数Symbols(见上文)可以被垃圾收集,即通过以下方式在 ruby​​ 内部创建的符号String拘留(#intern, #to_sym, ETC。)。 (这些都是被创造出来的《凡人的象征》)

小警告包括诸如

 define_method(param[:meth].to_sym) {}

这似乎是因为它正在调用to_sym它应该是一个《凡人的象征》但是由于define_method calls rb_intern为了保留方法引用,它实际上会创建一个《不朽的象征》

希望这个总结有助于解释必要性Symbol在 ruby​​ 中,不仅从开发人员的角度来看,而且作为Cruby 实现的内部结构。

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

Ruby 符号的存在是因为字符串是可变的且不可保留的吗? 的相关文章

  • Rails 3 - “无法解析 Yaml”

    我不知道我做错了什么 我尝试运行 rails c 但它只是给了我一个错误 10 分钟前它还在工作 C Ruby192 lib ruby 1 9 1 psych rb 148 in parse couldn t parse YAML at l
  • 如何编写一个在安装 RubyGem 时调用的钩子?

    我想编写一个 Ruby 片段 当我的 Gem 首次安装时运行 sudo gem install mygem 能做到吗 看起来并没有真正支持 我发现了一个 post install message 属性 您应该能够在 gem 规范中设置该属性
  • Ruby mp3 Id3 解析

    目前我正在从事一个音乐项目 处理用户 mp3 上传 问题是我找不到适用于所有文件的 id3 库 我努力了id3 ruby and Mp3Info库 但它们都没有给我一致正确的结果 例如 最常见的问题 错误的流参数 比特率和采样率 有时是持续
  • ||= 是什么意思? [复制]

    这个问题在这里已经有答案了 我的应用程序控制器中有一个受保护的方法 def current user current user User find by id session user id end 我想知道什么 方法 我一直在努力寻找和找
  • Ruby 的字符串并置功能的官方文档在哪里?

    我最近意识到 如果你并置一系列 Ruby 字符串文字 例如 a b c 它相当于这些字符串文字的串联 但是 我在任何地方都找不到这种语言功能的记录 我使用术语 并置 和 串联 进行搜索 但只在几个 StackOverflow 响应中找到了对
  • class_eval、class_exec、module_eval 和 module_exec 之间有什么区别?

    我正在读Module文档 但似乎无法理解它们的差异以及应该在哪里使用 怎么样eval不同于exec 我将回答比你的问题更多的内容 包括instance eval exec 在你的问题中 所有变体 instance module class
  • 如何使用 Ruby on Rails 3 检查 HTTP 请求的“Content-Length”字段?

    我正在使用 Ruby on Rails 3 在我的视图文件中我有以下代码 为了避免服务器过载 我会在服务器接收上传文件之前检查上传文件的大小 这是因为 按下表单的提交按钮 服务器会先完整接收文件 然后再检查文件 我知道一个HTTP 请求有标
  • Emacs、ruby:将 do 结束块转换为大括号,反之亦然

    我经常发现自己转换这样的代码 before do something end to before something 有没有办法在 emacs 中自动执行此任务 我使用 ruby mode 和 rinary 但它们在这里没有太大帮助 rub
  • 在 mac os Sierra 上,卡在“设置 CocoaPods 主存储库”上

    转移到 mac os sierra 后 我完全格式化了我的 mac 现在每次运行时我都面临安装 cocoapods 的问题sudo gem install cocoapods pre一切都安装得很好 当我尝试安装 Pod 时 终端堆栈打开S
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 随机采样数组的唯一子集

    如果我有一个数组 a 1 2 3 如何随机选择数组的子集 以使每个子集的元素都是唯一的 也就是说 对于a可能的子集是 1 2 3 1 2 2 3 1 2 3 我无法生成所有可能的子集 因为 a 的实际大小非常大 因此有很多很多子集 目前 我
  • Ruby on Rails 离线编程

    我将离开互联网几周 但仍然想完成一个项目 我应该采取哪些步骤来确保在断开连接时能够访问我需要的内容 ruby 和 ROR 离线时 以下内容很难获得 gems docs Rails 专家博客 堆栈溢出 so gem 安装尽可能多 下载所有的轨
  • 覆盖 Sinatra 默认的 NotFound 错误页面

    有没有办法覆盖 sinatra 默认的 NotFound 错误页面 Sinatra 不知道这个小曲 我希望 sinatra 在未找到正确的路由时仅将纯字符串显示为 未找到方法 但是当我从路由内部引发 404 错误时 我希望它显示传入的错误消
  • 生成源映射时出错 - grunt 和 sass 配置

    我正在尝试将 sass 与 grunt 一起使用 我已经在我的路径中安装了 ruby sass 和 grunt 版本是 节点 0 10 20npm 11 3 1grunt cli 0 1 13咕噜声 0 4 5萨斯 3 4 4 我的包 js
  • Ruby 在 Windows 上找不到 sqlite3 驱动程序

    我正在尝试在 Windows 上设置 Ruby on Rails 我正在使用看起来不错的 Flash Rails 发行版 但是 sqlite3 有一个问题 我发现线程告诉我安装版本 1 2 3 安装得很好 我使用的是 ruby 1 9 0
  • 启动同一作业的多个延迟作业进程

    我在运行多个工作人员的设置中使用延迟作业 就我的问题而言 这并不重要 但假设我运行 10 个工作线程 当前在开发模式下执行此操作 我遇到的问题是两个不同的工作人员有时开始处理同一项工作 调用我的工作对象上的执行方法 据我所知 延迟作业正在使
  • ubuntu 12.04 ruby​​ 2.0 Rails:找不到“thread_safe”

    我正在 ubuntu 12 04 上安装 Rails 使用以下方法手动安装 如何在 Ubuntu 12 04 上正确安装 ruby 2 0 0 https stackoverflow com questions 16222738 how t
  • 如何从数组中提取特定元素?

    如果我有一个数组a 1 2 3 4 5 6 7 8 9 10 我想要这个数组的一个子集 第 1 个 第 5 个和第 7 个元素 是否可以通过简单的方式从该数组中提取这些内容 我在想这样的事情 a 0 4 6 1 5 7 但这行不通 还有一种
  • 将一幅图像合成到另一幅图像上时,RMagick 透明度不起作用

    在下面的代码中 我尝试在一些山脉的图像上覆盖一个透明的正方形 我认为它会起作用 但是通过设置background color none 它不会使图像透明 结果是左上角有一个黑色方块 所需的结果是黑色方块应该是透明的 require open
  • 我应该如何使用 alias_method_chain 作为构建方法?

    我正在使用 Ruby on Rails 3 2 13 我想正确使用alias method chain build option name声明 因为我收到一个奇怪的错误 那是 在我的控制器文件中我有 class Articles Comme

随机推荐

  • 循环赛分组名单组合

    编辑 我的问题并不像有人标记的那样重复 另一个问题是不正确的 甚至不起作用 我尝试了几种方法对 itertools combinations 的结果进行分组 但无法得出正确的输出 在游戏中创建比赛需要它 每支球队每天都需要比赛 但仅限一次
  • 计算机视觉:提取有关给定轮廓的形状的信息(例如尖的、圆形的......)

    给定线条和顶点形式的形状的 2D 轮廓 如何从中提取信息 比如 尖的 圆的 直线 形状与给定形状的相似度 代码不是必需的 我更感兴趣 涉及的概念和技术名称 指导我的搜索 提前致谢 影像瞬间 一种方法是计算二维轮廓所描述的形状的一阶和二阶中心
  • 全文搜索:Whoosh Vs SOLR

    我正在开发一个 Django 项目 我需要在其中实现全文搜索 我看过 SOLR 并发现了一些很好的评论 但由于它是用Java实现的 需要在系统上安装java环境和Python 在寻找 SOLR 的 python 等效项时 我见过 Whoos
  • 将 scala 代码概括为函数

    所以我最近不小心写了一个Scala问题的Haskell答案 由于对 Haskell 相当熟悉 解决方案对我来说很容易 myMaxBy a gt a gt Ordering gt a gt a myMaxBy undefined myMaxB
  • 在 BigQuery 中流式传输数据

    在 BigQuery 中流式传输数据后 新数据仅在表中可用一段时间 因为我刷新页面数据消失了 但我仍然可以查询 主要问题是每次我关闭选项卡并再次从存储访问它时可以看到表中的数据 但当我刷新页面时 它又消失了 数据在表中 有时你会看到这样的消
  • Python、嵌套循环、匹配和性能

    我正在尝试使用 Python 2 7 和 Levenshtein 函数将姓氏列表与全名列表进行匹配 为了减少工作量 我仅在第一个字母相同的情况下进行匹配 尽管这似乎在性能方面没有太大差异 如果找到匹配项 则将从全名中删除匹配的单词 以使后续
  • 如何使用vs2012部署mvc 3 /4

    首先 我尝试在网上搜索如何执行此操作 但所有这些都不适合我 还尝试了 Web 部署 Web 部署包和文件系统 如果你们可以的话 我想要的是一个简单的分步指南以及部署 Web 项目的要求 我现在有一个新安装的win7 虚拟机 我在其中尝试了我
  • Spearman 在 R 领带中的 cor.test 是否已修正?

    我想知道 R 中用于计算 Spearman rho 的 cor test 函数是否是平局校正或不 我在其中找不到直接答案官方 R 文档 http stat ethz ch R manual R devel library stats htm
  • 基于一列值的 Excel VBA 过滤表

    我有一个表 我想按其中一列中的值过滤行 用于过滤的值存储在单独的列中 而不是在表中 这是我到目前为止所拥有的 Dim table1 As ListObject Dim range1 As Range Set range1 ActiveShe
  • 谷歌在火狐浏览器中放置错误

    我使用 google places autocomplete 来填充字段地址 地址 城市 国家 地区 邮政编码 纬度 经度 它在所有浏览器中都能很好地工作 但在 Firefox 浏览器中并非每次都能工作 这可能是由缓存引起的 火狐浏览器 代
  • 在python中将数组的字符串表示形式转换为numpy数组

    I can 将列表的字符串表示形式转换为列表 https stackoverflow com questions 1894269 convert string representation of list to list in python
  • 无法解析Build/build.framework.js.br

    我们已将统一应用程序上传到托管商 当我们从应用程序启动index html时 出现错误 无法解析Build build framework js br 如果启用了构建压缩 但托管内容的 Web 服务器配置错误 不提供包含 HTTP 响应标头
  • CSS 显示调整大小和裁剪的图像

    我想显示来自 URL 的具有特定宽度和高度的图像 即使它具有不同的尺寸比例 所以我想调整大小 保持比例 然后将图像剪切到我想要的大小 我可以用 html 调整大小img财产和我可以削减background image 我怎样才能两者兼得 E
  • 如何在键盘上方显示对话框

    我是android新手 我编写了一个应用程序 当用户选择一件事时 它使用对话框显示数据 对话框如下所示 https docs google com file d 0B3NUAgD0tB0YOS16azFCWXdSVVE edit https
  • python的哈希函数在不同版本中保持相同吗?

    我目前正在使用hash在整数和字符串的元组 以及整数和字符串的嵌套元组等 上 以计算某些对象的唯一性 除非可能存在哈希冲突 我想知道 是hash那些数据类型上的函数保证为不同版本的 Python 返回相同的结果 不会 除了 32 位和 64
  • 保存复选框状态

    我需要知道是否可以保存 a 的状态CheckBox在 C 中 我的意思是如果我检查CheckBox并关闭程序 一旦我重新启动程序CheckBox仍将保持检查状态 是否有可能 这是一个相当普遍的问题 您需要以某种方式自己序列化状态 但是如何以
  • 如何将字节写入文件?

    我有一个返回字符串的函数 该字符串包含回车符和换行符 0x0D 0x0A 但是 当我写入文件时 它仅包含新的换行符 有没有办法让输出包含回车符和换行符 msg function arg1 arg2 arg3 f open tmp outpu
  • 如何在无镜像包的flutter中使用ByteData和ByteBuffer

    我正在尝试开发一个 UDP 应用程序来接收数据并将字节转换为不同的数据类型 我有下面的代码 可以在单独使用 Dart 时使用 import dart io import dart typed data import dart mirror
  • 如何将常量作为函数名来调用?

    在 PHP 中 您可以通过在变量中调用函数名称来调用函数 function myfunc echo works func myfunc func Prints works 但是 你不能用常量来做到这一点 define func myfunc
  • Ruby 符号的存在是因为字符串是可变的且不可保留的吗?

    我使用 Ruby 已经大约一年了 有一个语言问题 符号是否是必要的 因为 Ruby 字符串是可变的且不被保留 例如 在 Java 中 字符串是不可变的且被保留的 所以 foo 在值和引用上总是等于 foo 并且它的值不能改变 在 Ruby