我是 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
该解决方案有效。
我的问题是:这也可以通过包装类来完成。哪个会更好?我发现给定解决方案的任何(隐藏)问题。