访问Thor Option哈希

ban*_*ola 3 ruby thor

我想将一个值合并到Thor选项哈希中.

如果我只是使用合并我得到一个错误,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)
Run Code Online (Sandbox Code Playgroud)

Roa*_*ter 5

哈希被冻结:

"防止对obj进行进一步修改.如果尝试修改,将引发RuntimeError.无法解冻冻结的对象."

您可以复制options到新的哈希(将解冻)并修改它.

new_options = options.dup
options = new_options
options.merge!(:a => "this will work now")
Run Code Online (Sandbox Code Playgroud)

或者如果你想让它更简洁:

options=options.dup
options.merge!(:a => "this will work now")
Run Code Online (Sandbox Code Playgroud)

Thor库默认返回一个冻结的哈希,所以另一种选择是修改库以返回未解冻的哈希,但我认为第一个解决方案已经足够好了.

下面是Thor的解析函数源代码的链接,您会注意到它在实际返回之前冻结了"assign"返回哈希值(转到页面底部(Object) parse(args),然后点击"查看源代码".冻结在源代码段的第83行.)

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