3

我想将一个值合并到一个Thor 选项 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)
4

1 回答 1

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 的 parse 函数的源代码链接,您会注意到它在实际返回之前冻结了“assigns”返回哈希(转到页面底部,然后在 下(Object) parse(args),单击“查看源代码”。冻结位于源代码片段的第 83 行。)

http://rubydoc.info/github/wycats/thor/master/Thor/Options

于 2012-02-16T19:38:41.807 回答