saw*_*awa 23 ruby string hash mutable
根据规范,用作哈希键的字符串被复制和冻结.其他可变对象似乎没有这么特别的考虑.例如,使用数组键,可以使用以下内容.
a = [0]
h = {a => :a}
h.keys.first[0] = 1
h # => {[1] => :a}
h[[1]] # => nil
h.rehash
h[[1]] # => :a
Run Code Online (Sandbox Code Playgroud)
另一方面,使用字符串键不能完成类似的操作.
s = "a"
h = {s => :s}
h.keys.first.upcase! # => RuntimeError: can't modify frozen String
Run Code Online (Sandbox Code Playgroud)
当涉及到散列键时,为什么字符串被设计为与其他可变对象不同?是否存在此规范变得有用的用例?该规范还有哪些其他后果?
yamlgem 阅读了一个描述哈希的手动编写的YAML文件.键可能是字符串,我想在原始YAML文件中允许不区分大小写.当我读取文件时,我可能会得到这样的哈希:
h = {"foo" => :foo, "Bar" => :bar, "BAZ" => :baz}
Run Code Online (Sandbox Code Playgroud)
我想将键规范化为小写以获得:
h = {"foo" => :foo, "bar" => :bar, "baz" => :baz}
Run Code Online (Sandbox Code Playgroud)
做这样的事情:
h.keys.each(&:downcase!)
Run Code Online (Sandbox Code Playgroud)
但由于上述原因,返回错误.
ste*_*lag 22
简而言之,只是Ruby试图变得更好.
在哈希中输入密钥时,使用hash密钥的方法计算特殊编号.Hash对象使用此数字来检索密钥.举例来说,如果你问什么价值h['a'],哈希调用hash字符串"A"方法和检查其是否具有存储该号码的值.当有人(你)变异的字符串对象,所以字符串"一"是现在别的东西,让我们说"AA",就会出现问题.哈希不会找到'aa'的哈希值.
散列的最常见键类型是字符串,符号和整数.符号和整数是不可变的,但字符串不是.Ruby试图通过加密和冻结字符串键来保护您免受上述混淆行为的影响.我想这对其他类型没有做,因为可能有令人讨厌的性能副作用(想想大型数组).