使用点路径键字符串访问 Ruby 哈希
Rails I18n 库将 YAML 文件转换为可使用 t() 函数通过点路径调用访问的数据结构。
t('one.two.three.four')
有谁知道如何使用 Ruby Hash 来做到这一点?或者只能直接通过 YAML 对象实现?
The Rails I18n library transforms a YAML file into a data structure that is accessible via a dotted path call using the t() function.
t('one.two.three.four')
Does anyone know how to do this with a Ruby Hash? Or is it only possible directly via a YAML object?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
只需在路径中的一个点上分割并迭代它即可找到正确的哈希值?
或者,您可以通过递归迭代整个结构来构建新的哈希:
Just split on a dot in the path and iterate over this to find the right hash?
Alternatively you can build a new hash by iterating recursively over the whole structure:
Ruby 2.3 引入了
dig
方法 会查看嵌套数组/哈希,当没有找到数据时它会返回nil
。例如:
当然,如果您的嵌套使用字符串键,则不需要 to_sym 步骤。
Ruby 2.3 introduces the
dig
method that looks into nested arrays/hashes, it returnsnil
when no data is found.For example:
Of course if your nested use string keys, the to_sym step is not needed.
是的,我不认为这是内置的,其他任何地方。但我在我的一个项目中使用了这样的东西:
然后这样称呼它
Yeah, I don't think that's built-in, anywhere else. But I use something like this in one of my projects:
And then call it like
我建议看一下这个要点:
https://gist.github.com/potatosalad/760726
它添加了
内爆 和
explode
方法到Hash
对象,将嵌套键转换为单级点路径键,反之亦然。I would suggest taking a look at this gist:
https://gist.github.com/potatosalad/760726
It adds
implode
andexplode
methods toHash
object that transforms nested keys to single-level dotted path keys, and vice versa.还有一个 Gem keypath-ruby
查看代码(并猜测一下
t
是),看起来你可以这样做:There is a Gem too keypath-ruby
Looking at the code (and guessing a little about what
t
is), it looks like you can do this:这段代码不仅允许点表示法遍历哈希,还允许方括号遍历带有索引的数组。它还避免了递归以提高效率。
例子:
This code not only allows dot notation to traverse a Hash but also square brackets to traverse Arrays with indices. It also avoids recursion for efficiency.
Example:
还有HashDot。
HashDot 允许在哈希上使用点表示法语法。它比使用 OpenStruct 创建的对象更快、更容易遍历。
There is also HashDot.
HashDot allows dot notation syntax use on hashes. It is faster, and more traversable than an object created with OpenStruct.