使用splat参数从多维哈希中获取

时间:2014-12-10 12:13:14

标签: ruby hash

我无法想出一个很好的方法来访问splat运算符中提供的键名称的多维哈希 - 任何建议?

实施例: 我喜欢哈希

{
  'key' => 'value',
  'some' => {
     'other' => {
         'key' => 'othervalue'
     }
  }
}

和函数定义def foo(*args)

我想返回foo('key') valuefoo('some','other','key') othervalue。所有我能想到的都是相当漫长而丑陋的循环,有很多nil?检查,并且我确定我错过了一种更好的红宝石方式来做到这一点。任何提示都表示赞赏。

更新

使用下面Patrick的回复,我想出了

def foo(hash, *args) 
  keys.reduce(hash, :fetch)
end

按照我的预期工作。谢谢!

1 个答案:

答案 0 :(得分:9)

在其他一些语言中,这称为get_in,例如ClojureElixir。这是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"