Вот мой ремикс на ответ sepp2k. Это немного больше ОО и работает даже в 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! Я не знал это существовало.
Вот еще одна версия, использующая 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
Я уверен, что смог бы сделать код более плотным (если бы я знал, как).