很多时候人们使用符号作为Ruby哈希中的键.
使用字符串有什么好处?
例如:
hash[:name]
Run Code Online (Sandbox Code Playgroud)
与
hash['name']
Run Code Online (Sandbox Code Playgroud) 根据规范,用作哈希键的字符串被复制和冻结.其他可变对象似乎没有这么特别的考虑.例如,使用数组键,可以使用以下内容.
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)
当涉及到散列键时,为什么字符串被设计为与其他可变对象不同?是否存在此规范变得有用的用例?该规范还有哪些其他后果?
yaml
gem 阅读了一个描述哈希的手动编写的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)
但由于上述原因,返回错误.