我希望能够以声明方式指定从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哈希?
答案 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,绝对不是一般情况下的生产质量,但它是一种解决方案。