Если это всего лишь небольшой скрипт, его можно расширить Hash
class Hash
def method_missing sym,*
fetch(sym){fetch(sym.to_s){super}}
end
end
method_missing
- это магический метод, который вызывается всякий раз, когда ваш код пытается вызвать метод, который не существует. Ruby перехватит сбойный вызов во время выполнения и позволит вам обработать его, чтобы ваша программа могла корректно восстановиться. Вышеприведенная реализация пытается получить доступ к хешу, используя имя метода в качестве символа, используя имя метода в виде строки, и в конечном итоге завершается ошибкой, если во встроенном методе Ruby отсутствует ошибка.
Для более сложных приложений, где добавление этого поведения ко всем хэшам может нарушить другой код или гемы третьих сторон, использовать модуль и расширять каждый экземпляр
module H
def method_missing sym,*
fetch(sym){fetch(sym.to_s){super}}
end
end
the = { answer: 42 }
the.extend(H)
the.answer # => 42
и для большего удобства вы можете даже распространять модуль до вложенных хэшей
module H
def method_missing sym,*
r = fetch(sym){fetch(sym.to_s){super}}
Hash === r ? r.extend(H) : r
end
end
the = { answer: { is: 42 } }
the.extend(H)
the.answer.is # => 42