将字符串转换为散列中的键路径

Gar*_*ary 1 ruby

我有一个字符串string = "this_is_a_test"和哈希hash.如何将字符串转换为键路径,以便返回位于以下位置的值:hash['this']['is']['a']['test']

我不想简单地将字符串拆分成数组; 我想使用字符串作为密钥来访问哈希.密钥已存在于散列中.

Sir*_*ius 5

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)