0

我是 Ruby 的新手,我对哈希值不能作为对象(myHash.key)访问感到有点失望,正如许多其他问题中所指出的那样(例如:如何使用哈希键作为方法上课?)。我不喜欢 openstruct 解决方案,因为它不是递归的,我不想修改 Hash 类。

因此,我开发了以下解决方案。首先定义以下模块:

module NiceHash
  def method_missing(name, *args, &blk)
    if args.empty? && blk.nil? && self.has_key?(name.to_s)
      result=self[name.to_s]
      if result.is_a? Hash
        result.extend(Nice_Hash)
      end
      return result
   else
     super
   end
  end
  def respond_to?(sym, include_private = false)
    super(sym, include_private) || (self.has_key?(sym.to_s))
  end
end

然后使用它

a={"a"=>"a"}
a.extend(NiceHash)
a.a

该解决方案有效。

我的问题是:这也可以通过包装类来完成。哪个会更好?我发现给定解决方案的任何(隐藏)问题。

4

1 回答 1

0

回答您关于解决方案隐藏问题的问题,主要有两个。

  1. 正如其他人在评论中提到的那样,当键不是有效的 ruby​​ 方法名称时,它会中断。
  2. 您的解决方案基于 method_missing,就像 OpenStruct 一样。因此,它具有相同的缺点。如OpenStruct 文档中所述:

OpenStruct 利用 Ruby 的方法查找结构来查找和定义属性的必要方法。这是通过方法method_missing 和define_method 完成的。

如果担心所创建对象的性能,这应该是一个考虑因素,因为与使用 Hash 或 Struct 相比,设置这些属性的开销要大得多。

于 2013-05-08T13:14:57.827 回答