Вот мой ремикс на ответ sepp2k. Это немного больше OO и работает даже в irb
. Не уверен, следует ли исправлять Object
или Hash
.
class Hash
def keys_to_methods()
each do |k,v|
self.class.send(:define_method, k, Proc.new {v});
end
length
end
end
Код испытания
hash = {:color_one=>"black", :color_two=>"green"}
hash.keys_to_methods
has.color_one # returns black
OpenStruct: благодаря sepp2k снова! Я не знал, что существует this.
Вот еще один вариант использования method_missing
class Hash
def method_missing(method_id)
key = method_id.id2name
if has_key?(key)
return self[key]
elsif has_key?(key.to_sym)
return self[key.to_sym]
else
super.method_missing(method_id)
end
end
end
hash = {:color_one=>"black", :color_two=>"green"}
hash.color_one
Я уверен, что я мог бы получить код туже (если бы я знал, как).
На самом деле было бы более чистым, если бы вы использовали переменную для хэша и паттерна обезьяны для класса модуля. Мне это очень нравится. Благодарю. –
Я повторил ваш ответ немного в моем «ответе» ниже ... хотя мне нужно выяснить, какая версия лучше в контексте исходного вопроса (помощника). –