【问题标题】:Map Accessors to Wrapped Object将访问器映射到包装对象
【发布时间】:2013-01-17 10:40:31
【问题描述】:

我有一个平面哈希:

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

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

【问题讨论】:

  • 为什么不{"prop_one" => 100, "prop_two" => 200, "prop_three" => 300}?
  • 因为我们可能正在切换属性值的来源,所以我不希望所有内容都引用一个对象。而是一堂课。
  • 不,我的意思是Hash[...],为什么要使用这种复杂的方式来构建哈希。只是出于好奇。

标签: ruby hash proxy accessor


【解决方案1】:

如果您有动态哈希键,请使用OpenStruct;如果键是静态的并且性能很重要,请使用Struct

OpenStruct 可以通过其marshal_dump 方法转换回哈希

【讨论】:

  • 谢谢。看起来很棒。但似乎没有办法使属性只读。刚刚编辑了问题以强调我希望它们为只读的事实。
【解决方案2】:

你也可以实现method_missing方法。当 obj 收到无法处理的消息时,Ruby 会调用它。

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

【讨论】:

    猜你喜欢
    • 2017-07-02
    • 2017-10-30
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    相关资源
    最近更新 更多