如何保存哈希中嵌套键及dig获取键的值?哈希赋值写法咨询
嗨,我来一步步帮你搞定这些Ruby哈希的问题~
1. 获取并保存键d对应的值
首先得提一句,你的嵌套哈希定义里e得是个已定义的变量或者具体值哦,比如先设e = "我的值"。要拿到:d对应的值,有两种常用方式:
- 逐层链式访问:直接顺着层级点出来就行,把结果存到变量里:
不过要注意,如果中间某一层不存在(比如e = "original_value" a = {b: {c: {d: e}}} d_value = a[:b][:c][:d] # 这里d_value就等于"original_value"啦a[:b][:不存在的键]),会直接抛出NoMethodError,因为nil没法用[]方法。 - 用dig方法安全访问:这个方法更稳妥,遇到不存在的层级会返回
nil而不是报错,赋值方式一样简单:
两种方式都能把d_value = a.dig(:b, :c, :d):d的值稳稳存到变量里。
2. 保存通过dig方法获取的值
其实这个和上面的逻辑完全一致——dig方法本身就会返回对应键的值,你直接把它赋值给变量就搞定了:
# 先定义好哈希 a = {b: {c: {d: "hello world"}}} # 用dig获取并存起来 saved_value = a.dig(:b, :c, :d) puts saved_value # 会输出"hello world"
如果中间某一层不存在,saved_value就会是nil,不会炸锅,这也是dig特别实用的地方。
3. 关于你提到的特殊赋值写法
很可惜,你说的x = [:b][:c]和a(x) = "foo"这种写法是行不通的,原因有两个:
- 首先,
[:b]是个只有一个元素的数组,数组只能用整数索引(比如[:b][0]能拿到:b),用:c当索引的话会直接返回nil,因为数组根本不认这种键。 - 其次,Ruby里没有
a(x) = "foo"这种赋值语法,哈希的赋值必须用a[:键] = 值或者链式的a[:b][:c] = 值这种形式。
如果想要把a改成{b:{c:"foo"}},正确的写法是直接给:c重新赋值:
a[:b][:c] = "foo"
执行完这行代码后,a就变成你想要的{:b=>{:c=>"foo"}}啦。
内容的提问来源于stack exchange,提问作者Adam Ludian
相关产品推荐
相关产品推荐

