相关疑难解决方法(0)

为什么在Ruby中使用符号作为哈希键?

很多时候人们使用符号作为Ruby哈希中的键.

使用字符串有什么好处?

例如:

hash[:name]
Run Code Online (Sandbox Code Playgroud)

hash['name']
Run Code Online (Sandbox Code Playgroud)

ruby string symbols hashmap

158
推荐指数
3
解决办法
5万
查看次数

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

根据规范,用作哈希键的字符串被复制和冻结.其他可变对象似乎没有这么特别的考虑.例如,使用数组键,可以使用以下内容.

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)

但由于上述原因,返回错误.

ruby string hash mutable

23
推荐指数
1
解决办法
4084
查看次数

标签 统计

ruby ×2

string ×2

hash ×1

hashmap ×1

mutable ×1

symbols ×1