我正在使用eval来处理哈希。这部分有效:
some_hash = {"a" => {"b" => "c"}}
target_hash = "some_hash"
target_key = "['a']"
my_value = eval(target_hash + target_key)
puts "my_value " + my_value.to_s
并打印:
my_value {"b"=>"c"}
如何使用eval更改值,以便哈希导致:
some_hash = {"a" => {"d" => "e"}}
由于
编辑:
我认为我没有正确解释。我必须深入研究哈希,但我希望能够灵活地使用在运行时设置的字符串。该字符串可以是"['key_level_1']['key_level_2']['key_level_3']"
,它应该引用some_hash['key_level_1']['key_level_2']['key_level_3']
。
而且,我需要将该值设置为某种值。这有意义吗?
答案 0 :(得分:1)
我会拿一个数组,例如['key1', 'key2', 'key3']
(可以从格式正确的字符串构造)和"根对象"并用它来定位一个特定的"目标对象"分支(我会建议递归)。然后操纵所找到的相应对象。在这种情况下,some_hash
应该是"根对象"从而开始遍历,而不是字符串。
这是我写的真正旧的答案的链接(当我还在积极使用ruby时)。它没有处理赋值位,但我相信它显示了一个无eval的有效方法的开始:How do you access nested elements of a hash with a single string key?"目标对象"如果找到了,那么只需要为特定密钥分配新值。 (链接帖子中接受的答案也是一个宝石,如果不是更多的神秘和符号泄漏。)
快乐的编码。
答案 1 :(得分:1)
您可以使用Hash#replace
def changeHash(a, b, targetHash, targetKey)
change = ".replace({'#{a}' => '#{b}'})"
my_value = eval(target_hash + target_key + change)
end
some_hash = {"a" => {"b" => "c"}}
target_key = "['a']"
changeHash('d', 'e', 'some_hash', '["a"]')
答案 2 :(得分:0)
我建议设置一个这样的方法:
def hash_change(target_hash,target_key,*new_value)
if new_value
target_hash["target_key"] = new_value
end
puts "my_value " + target_hash["target_key"]
end
如果传递新值,这将使您可以灵活地显示原始哈希值或新哈希值。
编辑:抱歉忘记了对方法的调用
hash_change(some_hash,"a",{"d" => "e"})
答案 3 :(得分:0)
谢谢大家的帮助。我把它改了一下。我没有将字符串作为数组传递,而是传递一个这样的对象:
{some_hash => {"a" => {"b" => "nil"}}}
然后我递归遍历引用和真实哈希。当我在引用中检测到nil
时,我知道我在那里。