我想将值合并到Thor option hash。
如果我只是使用合并,我会收到一个错误,HashWithIndifferentAccess
我已阅读文档,但我很难理解如何使其工作。我想我希望这个问题能帮助我找到关于如何将值合并到这种哈希中的问题的答案,并理解如何阅读文档。
p options.inspect
#=> "{\"ruby\"=>\"/Users/work/.rbenv/versions/1.9.2-p290/bin/ruby\"}"
p options.merge!(:a => true)
#=> hash_with_indifferent_access.rb:26:in `[]=': can't modify frozen hash (RuntimeError)
答案 0 :(得分:5)
哈希被冻结:
“防止对obj进行进一步修改。将引发RuntimeError 如果尝试修改。没有办法解冻冻结 对象“。
您可以将options
复制到新的哈希值(将解冻)并修改它。
new_options = options.dup
options = new_options
options.merge!(:a => "this will work now")
或者如果你想让它更简洁:
options=options.dup
options.merge!(:a => "this will work now")
Thor库默认返回一个冻结的哈希,所以另一个选择是修改库以返回未解冻的哈希值,但我认为第一个解决方案已经足够了。
下面是Thor's parse函数源代码的链接,您会注意到它在实际返回之前冻结了“assign”返回哈希值(转到页面底部,并在(Object) parse(args)
下,单击“查看源”。冻结位于源代码段的第83行。)