gpt4 book ai didi

ruby - 字符串值作为散列键,创建副本

转载 作者:太空宇宙 更新时间:2023-11-03 17:51:49 27 4
gpt4 key购买 nike

在 irb 中使用字符串进行实验,注意到当引用字符串的变量用作哈希中的键值时,会创建字符串的新副本而不是对原始对象的引用,但事实并非如此使用数组:

1.9.3-p448 :051 > a = 'str1' 
=> "str1"
1.9.3-p448 :052 > b = 'str2'
=> "str2"
1.9.3-p448 :053 > arr = [a,b]
=> ["str1", "str2"]
1.9.3-p448 :054 > arr[0].object_id == a.object_id
=> true
1.9.3-p448 :055 > hash = { a => b }
=> {"str1"=>"str2"}
1.9.3-p448 :056 > hash.keys[0].object_id == a.object_id
=> false

我明白,如果我只是坚持使用符号,我就不会问这个问题。

复制字符串的目的是什么?我知道字符串比较仍然有效,但 object_id 比较肯定会更快?

最佳答案

来自 Hash.[]=文档:

key should not have its value changed while it is in use as a key (an unfrozen String passed as a key will be duplicated and frozen).

由于默认情况下,字符串在 ruby​​ 中不是不可变的,理论上您可以在将它们设置为散列中的键后更改它们。如果您这样做 - 您的散列将变得无效,因为它将无法正确找到这些 key 。

由于字符串无处不在并且经常通过引用使用,因此 Ruby 可以通过这种方式保护其哈希值免受难以检测的意外错误的影响。

关于ruby - 字符串值作为散列键,创建副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23542328/

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