我无法想出一个很好的方法来访问splat运算符中提供的键名称的多维哈希 - 任何建议?
实施例: 我喜欢哈希
{
'key' => 'value',
'some' => {
'other' => {
'key' => 'othervalue'
}
}
}
和函数定义def foo(*args)
我想返回foo('key')
value
和foo('some','other','key')
othervalue
。所有我能想到的都是相当漫长而丑陋的循环,有很多nil?
检查,并且我确定我错过了一种更好的红宝石方式来做到这一点。任何提示都表示赞赏。
使用下面Patrick的回复,我想出了
def foo(hash, *args)
keys.reduce(hash, :fetch)
end
按照我的预期工作。谢谢!
答案 0 :(得分:9)
在其他一些语言中,这称为get_in
,例如Clojure和Elixir。这是Ruby中的功能实现:
class Hash
def get_in(*keys)
keys.reduce(self, :fetch)
end
end
用法:
h = {
'key' => 'value',
'some' => {
'other' => {
'key' => 'othervalue'
}
}
}
h.get_in 'some'
#=> {
# "other" => {
# "key" => "othervalue"
# }
# }
h.get_in 'some', 'other'
#=> {
# "key" => "othervalue"
# }
h.get_in 'some', 'other', 'key'
#=> "othervalue"