gpt4 book ai didi

ruby - 为什么哈希的字符串键被卡住?

转载 作者:数据小太阳 更新时间:2023-10-29 06:29:11 26 4
gpt4 key购买 nike

根据specification ,用作哈希键的字符串被复制并卡住。其他可变对象似乎没有这种特殊考虑。例如,对于数组键,以下是可能的。

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

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


我实际上有一个用例,其中缺少关于字符串的这种特殊规范可能会有用。也就是说,我使用 yaml gem 读取了一个描述哈希的手动编写的 YAML 文件。键可能是字符串,我想在原始 YAML 文件中允许不区分大小写。当我读取文件时,我可能会得到这样的哈希:

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

我想将键规范化为小写来得到这个:

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

通过做这样的事情:

h.keys.each(&:downcase!)

但是由于上述原因返回错误。

最佳答案

简而言之,这只是 Ruby 想要变得友善。

当在哈希中输入一个键时,使用该键的 hash 方法计算一个特殊的数字。 Hash 对象使用此数字来检索 key 。例如,如果您询问 h['a'] 的值是什么,Hash 会调用字符串 'a' 的 hash 方法并检查它是否有值为该号码存储。当有人(你)改变字符串对象时,问题就出现了,所以字符串 'a' 现在是别的东西,比方说 'aa'。散列找不到“aa”的散列号。

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

关于ruby - 为什么哈希的字符串键被卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13044839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com