Access Thor Option Hash - PullRequest
       15

Access Thor Option Hash

3 голосов
/ 16 февраля 2012

Я хочу объединить значение в хэш опции 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)

1 Ответ

5 голосов
/ 16 февраля 2012

Хеш-код заморожен:

"Предотвращает дальнейшие изменения объекта. При попытке изменения будет вызвано 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 возвращает замороженный хеш по умолчанию, поэтому другой вариант - изменить библиотеку так, чтобы она возвращала незамерзающие хеши, но я думаю, что первое решение достаточно хорошо.

Ниже приведена ссылка на исходный коддля функции синтаксического анализа Тора вы заметите, что она замораживает возвращаемый хэш «assigns» перед его фактическим возвратом (перейдите к нижней части страницы и в разделе (Object) parse(args) нажмите «View Source». Замораживание находится на строке 83исходный фрагмент.)

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

...