我有一个字符串string = "this_is_a_test"和哈希hash.如何将字符串转换为键路径,以便返回位于以下位置的值:hash['this']['is']['a']['test']?
我不想简单地将字符串拆分成数组; 我想使用字符串作为密钥来访问哈希.密钥已存在于散列中.
Inject在这里很好用:
hash = "this_is_a_test".split('_').reverse.inject("final value") { |h, s| {s => h} }
Run Code Online (Sandbox Code Playgroud)
返回:
{"this"=>{"is"=>{"a"=>{"test"=>"final value"}}}}
Run Code Online (Sandbox Code Playgroud)
和:
hash['this']['is']['a']['test']
=> "final value"
Run Code Online (Sandbox Code Playgroud)
这里的解释是,每次注入迭代都返回一个哈希值,该哈希值包含当前字符串作为键,以及前一个哈希值作为值,因此每个新键都递归地包含到此为止的所有哈希值,包括传递的最深值作为注入的论据.
这就是为什么需要反转键数组的原因,因为哈希是从内到外创建的.
编辑:我相信我没有正确理解这个问题.
实际上你打算访问一个现有的递归哈希.
假设哈希是使用我之前的方法构建的,那么也可以通过注入来访问最里面的值:
"this_is_a_test".split('_').inject(hash) { |h,v| h[v] }
=> "final value"
Run Code Online (Sandbox Code Playgroud)
另请注意,Ruby 2.3 Hash#dig以安全的方式实现了新方法:
path = "this_is_a_test".split('_')
hash.dig(*path) # => "final value"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
637 次 |
| 最近记录: |