Rails I18n库将YAML文件转换为可通过虚线路径调用使用t()函数访问的数据结构。使用虚线路径密钥字符串访问Ruby哈希
t('one.two.three.four')
有谁知道如何与一个Ruby的Hash做到这一点?或者只能通过YAML对象直接使用?
Rails I18n库将YAML文件转换为可通过虚线路径调用使用t()函数访问的数据结构。使用虚线路径密钥字符串访问Ruby哈希
t('one.two.three.four')
有谁知道如何与一个Ruby的Hash做到这一点?或者只能通过YAML对象直接使用?
刚上点拆分路径和迭代此找到合适的哈希?
def convert_hash(hash, path = "")
hash.each_with_object({}) do |(k, v), ret|
key = path + k
if v.is_a? Hash
ret.merge! convert_hash(v, key + ".")
else
ret[key] = v
end
end
end
是的,我不认为这是内置的,在其他地方。但我用这样的事情在我的项目之一:
class Hash
def dig(dotted_path)
parts = dotted_path.split '.', 2
match = self[parts[0]]
if !parts[1] or match.nil?
return match
else
return match.dig(parts[1])
end
end
end
然后调用它像
my_hash = {'a' => {'b' => 'a-b', 'c' => 'a-c', 'd' => {'e' => 'a-d-e'}}, 'f' => 'f'}
my_hash.dig('a.d.e') # outputs 'a-d-e' (by calling my_hash['a']['d']['e'])
我建议采取看看这个要点:
https://gist.github.com/potatosalad/760726
它增加了implode
和
path.split(".").inject(hash) { |hash, key| hash[key] }
或者,你可以在整个结构递归迭代建立一个新的哈希explode
方法到Hash
将嵌套键转换为单级虚线路径键的对象,反之亦然。
有一个宝石太keypath-ruby
gem 'key_path', :git => 'https://github.com/nickcharlton/keypath-ruby.git'
看代码(和猜测有关什么t
是),它看起来像你可以这样做:
t.value_at_keypath('one.two.three.four')
此代码不仅允许点符号遍历散列,而且方括号也可以遍历具有索引的数组。它也避免了递归效率。
class Hash
def key_path(dotted_path)
result = self
dotted_path.split('.').each do |dot_part|
dot_part.split('[').each do |part|
if part.include?(']')
index = part.to_i
result = result[index] rescue nil
else
result = result[part] rescue nil
end
end
end
result
end
end
实施例:
a = {"b" => {"c" => [0, [1, 42]]}}
a.key_path("b.c[-1][1]") # => 42
红宝石2.3引入看起来成嵌套阵列/散列的dig
method,当没有数据被发现,它返回nil
。
例如:
test_data = {a: {b: {c: {d: 1}, e: 2}}}
path = 'a.b.c.d'.split('.').map(&:to_sym)
# path => [:a, :b, :c, :d]
test_data.dig(*path)
当然,如果你使用嵌套字符串键,不需要to_sym一步。
类似的方法现在在Ruby 2.3中可用,它正是名为[dig](http://ruby-doc.org/core-2.3.0/Hash.html#method-i-dig) –