Ruby中的声明性哈希查询

时间:2016-10-07 16:52:05

标签: ruby

我希望能够以声明方式指定从Ruby哈希返回的值。理想情况下,我可以编写一个可以针对给定哈希运行的查询,并将该查询存储为对象(字符串,哈希等)。

# for example
hash = {
  key1: {
    key2: [
      { a: 1, b: 2 }
    ]
  }
}
query = { path: ["key1", "key2"], key: :a, where: { b: 2 } }

Library.query(query, hash) #=> 1

我还没有找到任何好的图书馆。有没有一种好方法来查询这样的Ruby哈希?

1 个答案:

答案 0 :(得分:0)

虽然语法不太好,但是(我认为)在没有任何显式循环或条件的情况下执行您想要的操作:

>> require 'deep_enumerable'

>> hash.deep_get(:key1 => :key2)
       .find{|h| h[:b] == 2}
       .fetch(:a)

=> 1

如果您想将查询存储在变量中,可以这样做:

query =
  [[:deep_get, {:key1 => :key2}],
   [:find,     ->(h){h[:b] == 2}],
   [:fetch,    :a]]

query.inject(hash) do |h, (cmd, arg)|
  arg.is_a?(Proc) ? h.send(cmd, &arg) : h.send(cmd, arg)
end

这最多是hacky,绝对不是一般情况下的生产质量,但它是一种解决方案。