Я даже не уверен, что задаю правильный вопрос. Может я неправильно подхожу к проблеме, но в основном у меня вот такая ситуация:
obj = get_user(params)
obj.profile => {:name => "John D", :age => 40, :sex => "male"} #Has to be of class Hash
obj.profile.name => "John D"
obj.profile[:name] => "John D"
obj.profile.job => nil
Так что в основном я должен удовлетворить все эти условия, и я не уверен, как именно к этому подойти (я только сегодня изучил Ruby).
Обратите внимание на точечную нотацию для доступа к внутренним переменным, иначе я бы просто использовал profile как хэш символов. Итак, я попробовал два метода, которые только привели меня туда
Способ 1. Сделать профиль OpenStruct
Так что это позволяет мне получить доступ к имени, возрасту и полу, используя точечную нотацию, и автоматически возвращает nil, если ключ не существует, однако obj.profile имеет тип OpenStruct вместо Хеш
Метод 2. Сделать профиль отдельным классом
При этом я устанавливаю их как переменные экземпляра и могу использовать method_missing для возврата nil, если они не существуют. Но я снова столкнулся с проблемой, что obj.profile не является правильным типом/классом
Есть что-то, что мне не хватает? Есть ли способ, возможно, различать
obj.profile
obj.profile.name
в функции-получателе и вернуть либо хэш, либо что-то другое?
Могу ли я изменить то, что возвращает мой пользовательский класс для профиля, чтобы он вместо этого возвращал хэш?
Я даже пробовал проверять args и **kwargs в функции get для obj.profile, и ни один из них не помогает и не заполняется, если я вызываю obj.profile.something
obj.profile => {:name => "John D", :age => 40, :sex => "male"}
означает только то, что он должен возвращать представление, похожее на представление хеша. Это не обязательно означает, что это должен быть экземпляр Hash. Было бы неправильно интерпретировать ожидания таким образом? - person spickermann   schedule 20.02.2015