通过一组键获取ruby哈希值

Ere*_*bih 6 ruby arrays hash ruby-on-rails

我的目标是创建一个用哈希初始化的对象,然后查询该对象以从该哈希中获取值.为了让事情更清楚,这是我的意思的一个粗略的例子:

class HashHolder
  def initialize(hash)
    @hash = hash
  end

  def get_value(*args)
    # What are my possibilities here?
  end
end

holder = HashHolder.new({:a => { :b => { :c => "value" } } } )
holder.get_value(:a, :b, :c) # should return "value"
Run Code Online (Sandbox Code Playgroud)

我知道我可以在参数列表上执行迭代,如下所示:

def get_value(*args)
  value = @hash
  args.each do |k|
    value = value[k]
  end
  return value
end
Run Code Online (Sandbox Code Playgroud)

但是,如果我计划大量使用这种方法,那么当我想要做的就是访问哈希值时,这会大大降低我的性能.

有什么建议吗?

Ekk*_*ein 9

更新答案,因为它被问到已经有一段时间了.

(在ruby 2.3.1中测试)

你有这样的哈希:

my_hash = {:a => { :b => { :c => "value" } } }
Run Code Online (Sandbox Code Playgroud)

问的问题是:

my_hash.get_value(:a, :b, :c) # should return "value"
Run Code Online (Sandbox Code Playgroud)

答:使用'dig'而不是get_value,如下所示:

my_hash.dig(:a,:b,:c) # returns "value"
Run Code Online (Sandbox Code Playgroud)

由于问题的标题具有误导性(它应该类似于:如何使用键数组在嵌套哈希中获取值),这里是实际问题的答案:

通过一组键获取ruby哈希值

制备:

my_hash = {:a => 1, :b => 3, :d => 6}
my_array = [:a,:d]
Run Code Online (Sandbox Code Playgroud)

回答:

my_hash.values_at(*my_array) #returns [1,6]
Run Code Online (Sandbox Code Playgroud)