为什么哈希的字符串键被冻结?

2024-02-27

根据规格 http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-store,用作哈希键的字符串被复制并冻结。其他可变对象似乎没有这样特殊的考虑。例如,使用数组键,可以进行以下操作。

a = [0]
h = {a => :a}
h.keys.first[0] = 1
h # => {[1] => :a}
h[[1]] # => nil
h.rehash
h[[1]] # => :a

另一方面,使用字符串键无法完成类似的操作。

s = "a"
h = {s => :s}
h.keys.first.upcase! # => RuntimeError: can't modify frozen String

当涉及到哈希键时,为什么字符串的设计与其他可变对象不同?该规范是否有任何有用的用例?该规范还有哪些其他后果?


I actually have a use case where absence of such special specification about strings may be useful. That is, I read with the yaml gem a manually written YAML file that describes a hash. the keys may be strings, and I would like to allow case insensitivity in the original YAML file. When I read a file, I might get a hash like this:
h = {"foo" => :foo, "Bar" => :bar, "BAZ" => :baz}

我想将按键标准化为小写以获得以下结果:

h = {"foo" => :foo, "bar" => :bar, "baz" => :baz}

通过这样做:

h.keys.each(&:downcase!)

但由于上面解释的原因,这会返回一个错误。


简而言之,Ruby 只是想表现得友善一点。

当在哈希中输入密钥时,会使用以下公式计算一个特殊数字:hash密钥的方法。 Hash 对象使用此数字来检索密钥。例如,如果你问h['a']是,哈希称为hash字符串“a”的方法并检查它是否存储了该数字的值。当某人(你)改变字符串对象时,问题就出现了,因此字符串“a”现在变成了其他东西,比如说“aa”。哈希找不到“aa”的哈希值。

哈希最常见的键类型是字符串、符号和整数。符号和整数是不可变的,但字符串不是。 Ruby 试图通过复制和冻结字符串键来保护您免受上述令人困惑的行为的影响。我想这不会适用于其他类型,因为可能会产生令人讨厌的性能副作用(想想大型数组)。

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

为什么哈希的字符串键被冻结? 的相关文章

随机推荐

  • Pygame PNG 图像看起来已损坏

    我正在跟进本指南 http www nerdparadise com tech python pygame basics part2 尝试在 Pygame 窗口中显示基本的 PNG 图像 我的图像是一个简单的 150x150 绿球 没有透明
  • 无法反序列化 lambda

    就像一个小项目一样 我一直在尝试制作一个小东西 读取序列化的 lambda 本地或从 FTP 并调用它们的运行函数作为测试的一部分 以试验 Windows 中的文件关联 即打开某些文件类型 用某个程序打开它们 等等 但无论我尝试什么 它似乎
  • getDimension()/getDimensionPixelSize() - 乘数问题

    所以我有 android 2 3 5 设备 它是 NORMAL HDPI 我的项目中有一个dimens xml
  • 从临时服务器连接到 GitoLite 时出错 - ECONNREFUSED 部署错误

    我在尝试将以前工作的项目部署到开发服务器时遇到了一些麻烦 我没有设置系统 但我确实拥有我需要的所有凭据 我认为 在尝试 cap staging 部署之后 我到目前为止 然后它产生了一个错误 请看下面 triggering load call
  • sed 用 C++ 注释替换(单行)C 注释

    我如何使用 sed 将源文件中的所有 C 风格注释替换为 C 风格 所有这些 int main some comments to int main some comments 所有注释都是单行 并且代码之间没有像这样的注释 int f in
  • 多层神经网络不会预测负值

    我已经实现了一个多层感知器来预测输入向量的正弦 这些向量由随机选择的四个 1 0 1 组成 偏差设置为 1 网络应该预测向量内容之和的 sin 例如 输入 输出 Sin 0 1 1 0 1 我遇到的问题是网络永远不会预测负值 并且许多向量的
  • 初始化 tkinter 类的父级/主控是什么?

    Note 示例代码是一个删节版本 但可以运行基本功能 请重点关注class MainWindow tk Frame 问题 什么样的object可以起到parent or master for tkinter class初始化 我的例子 看示
  • OpenGL重叠丑陋的渲染

    我正在尝试使用 OpenGL 2 1 渲染场景 但重叠形状的边框很奇怪 我测试了一些 OpenGL 初始化 但没有任何改变 我将问题简化为一个简单的测试应用程序 其中有 2 个球体 但结果相同 我尝试了一些关于 Gl DEPTH TEST
  • 警告:未找到提供程序 com.sun.xml.internal.bind.v2.ContextFactory

    我在 JSF 应用程序中集成了一些 Web 服务Jersey 一切正常 甚至 OAuth 识别也正常 但 当启动我的网络服务器时 我总是收到此错误 INFO Scanning for root resource and provider c
  • csrf 与 ajax 和 django post

    使用jquery v1 7 1和django 1 3 我试图通过ajax发出post请求 在我找到的一些教程代码中web http lethain com intro to unintrusive javascript with djang
  • 如何获取javafx中子节点的访问权限?

    我有一棵这样的树 正如您所看到的 GridPane 有 10 列 它们每个都包含包裹在 AnchorPane 中的 BorderPane 每个 BorderPane 由 2 个标签和 1 个单选按钮组成 您可以在下面看到它的样子 我想问您如
  • 如何从 javascript HTMLCollection 获取元素

    我不明白为什么我无法从 HtmlCollection 获取元素 此代码示例 var col document getElementsByClassName jcrop holder console log col 在控制台上产生以下输出 我
  • cv::warpPerspective 仅显示扭曲图像的一部分

    我使用 getHomography 和 warpPerspective 将图像从前视角更改为中视角 它的工作原理是图像扭曲到所需的视角 但裁剪被关闭 它将扭曲的图像大部分移动到图像框之外 我认为原因是因为操作导致负坐标 我已经手动计算了用于
  • Web API 令牌方案的好方法是什么?

    我正在为一个 Web 应用程序开发 REST API 到目前为止 我们已经在内部为几个配套应用程序开发了该 API 现在 我们正在考虑向外部开发人员开放 我们希望向 API 添加令牌 以帮助识别谁在发出请求 并总体上帮助管理其使用 此时 我
  • Jinja2 填充和对齐字符串

    我想实现类似的目标 https pyformat info string pad align https pyformat info string pad align 在 Jinja2 中 在 python 中 如果我希望字符串始终具有一定
  • 类型推断失败:没有足够的信息来推断参数请明确指定

    我正在尝试用 Kotlin 编写 Vaadin 应用程序 对于数据绑定 Vaadin 8 现在提供了类型安全数据绑定的可能性 在 Kotlin 中 我期望这样的工作 class LoginModel var username String
  • Formik 验证 isSubmitting / isValidating 未设置为 true

    我有一个用户要求的表格 我非常明显地表明该表格无效 所以我打算弹出一个sweetalert对话框让他们知道他们需要仔细检查表格 我想我可以在验证中这样做 以便在提交尝试失败时提醒他们 const validate values gt con
  • VBScript 中的 CRLF

    我是 VBScript 新手 我正在尝试编写一个函数来识别打印行中是否有 CRLF 你能帮我么 谢谢 你可以简单地使用result Instr yourString vbCRLF 如果 CRLF 字符序列存在于中 它将返回大于 0 的索引y
  • 如何在javascript中为隐藏变量分配空值?

    我有一个名为 str 的隐藏输入变量 我正在为其分配 abc 值 然后我尝试分配空值 或者说对它的空引用 但我不能 Edit 代码的一部分 隐藏领域
  • 为什么哈希的字符串键被冻结?

    根据规格 http www ruby doc org core 1 9 3 Hash html method i store 用作哈希键的字符串被复制并冻结 其他可变对象似乎没有这样特殊的考虑 例如 使用数组键 可以进行以下操作 a 0 h