ruby-on-rails - 通过键数组获取 ruby​​ 哈希值

标签 ruby-on-rails ruby arrays hash

我的目标是创建一个用散列初始化的对象,然后查询该对象以从该散列中获取值。 为了让事情更清楚,这里有一个粗略的例子来说明我的意思:

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"

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

def get_value(*args)
  value = @hash
  args.each do |k|
    value = value[k]
  end
  return value
end

但如果我打算大量使用这种方法,当我只想访问哈希值时,这会显着降低我的性能。

有什么建议吗?

最佳答案

更新答案已经有一段时间了。

(在 ruby​​ 2.3.1 中测试)

你有这样的哈希:

my_hash = {:a => { :b => { :c => "value" } } }

提出的问题:

my_hash.get_value(:a, :b, :c) # should return "value"

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

my_hash.dig(:a,:b,:c) # returns "value"

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

Getting ruby hash values by an array of keys

准备:

my_hash = {:a => 1, :b => 3, :d => 6}
my_array = [:a,:d]

答案:

my_hash.values_at(*my_array) #returns [1,6]

关于ruby-on-rails - 通过键数组获取 ruby​​ 哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13579827/

相关文章:

ruby-on-rails - 使用 ruby​​ 更改文件扩展名

ruby-on-rails - Rails 3 中 XML 构建器的布局

ruby - 在 Ruby 中解析 "X years and Y weeks ago"相似的字符串

ruby - 没有从 nil 到整数的隐式转换 - 当尝试向数组添加任何内容时

c++ - 为什么 std::accumulate 对于标准数组会有这样的行为?

ruby-on-rails - Rails 4 和 RSpec 3 : Testing models and allow_blank

javascript - 为什么 '' 在我的 charts.js.erb 文件中显示为 '(HTML 实体?)?

arrays - 数组标识 - 是

javascript - 从下拉列表中选择时将对象添加到数组。如果未选择,则从数组中删除

ruby-on-rails - block 中出现意外的语法错误