Ruby 将访问器映射到包装对象

Ruby 将访问器映射到包装对象,ruby,hash,proxy,accessor,Ruby,Hash,Proxy,Accessor,我有一个简单的散列: hash = Hash["prop_one" => 100, "prop_two" => 200, "prop_three" => 300] 我将其包装在一个类中,该类公开了这些值以通过访问器读取: class WrappedHash def prop_one config['prop_one'] end def prop_two config['prop_two'] end def prop_three

我有一个简单的散列:

hash = Hash["prop_one" => 100, "prop_two" => 200, "prop_three" => 300]  
我将其包装在一个类中,该类公开了这些值以通过访问器读取:

class WrappedHash

  def prop_one
    config['prop_one']
  end

  def prop_two
    config['prop_two']
  end  

  def prop_three
    config['prop_three']
  end

  def initialize(config)
    self.config = config
  end

end
有没有一种方法可以将这些属性的请求代理到哈希中,而不必手动添加访问器?(这是一个大散列)

如果您有动态散列键,或者键是静态的,并且性能很重要,请使用

OpenStruct可以通过其
封送转储
方法

转换回散列。如果您有动态散列键,或者键是静态的,并且性能很重要,请使用该方法


OpenStruct可以通过其
marshal\u dump
method

转换回哈希。您还可以实现method\u missing method。当obj收到无法处理的消息时,Ruby会调用它

class WrappedHash
  def method_missing(methId)
    config[methId.to_s]
  end
end

您还可以实现方法\u missing method。当obj收到无法处理的消息时,Ruby会调用它

class WrappedHash
  def method_missing(methId)
    config[methId.to_s]
  end
end

谢谢看起来不错。但是似乎没有办法将属性设置为只读。刚刚编辑了这个问题,强调我希望它们是只读的。谢谢。看起来不错。但是似乎没有办法将属性设置为只读。刚刚编辑了这个问题,强调了我希望它们是只读的事实。为什么不
{“prop_one”=>100,“prop_two”=>200,“prop_two”=>300
}?因为我们可能会切换属性值的来源,所以我不希望所有东西都引用对象。相反,它是一个类。不,我的意思是
散列[…]
,为什么要使用这种复杂的方式来构建散列呢。只是出于好奇。为什么不
{“prop_one”=>100,“prop_two”=>200,“prop_two”=>300
}?因为我们可能会切换属性值的来源,所以我不希望所有东西都引用对象。相反,它是一个类。不,我的意思是
散列[…]
,为什么要使用这种复杂的方式来构建散列呢。只是出于好奇。