【发布时间】:2015-10-28 18:10:49
【问题描述】:
目标:OpenStruct 对象的值应打印为哈希而不是对象
可能的解决方案:覆盖 OpenStruct 类的 getter
MyOpenStruct 覆盖 new、to_h 和 [] 的 OpenStruct。
class MyOpenStruct < OpenStruct
def initialize(object=nil)
@table = {}
@hash_table = {}
if object
object.each do |k,v|
if v.is_a?(Array)
other = Array.new()
v.each { |e| other.push(self.class.new(entry)) }
v = other
end
@table[k.to_sym] = (v.is_a?(Hash) ? self.class.new(v) : v)
@hash_table[k.to_sym] = v
new_ostruct_member(k)
end
end
end
def [](val)
@hash_table[val.to_sym]
end
end
但是覆盖[] 并没有任何区别。例如
irb(main):007:0> temp = MyOpenStruct.new({"name"=>"first", "place"=>{"animal"=>"thing"}})
=> #<MyOpenStruct name="first", place=#<MyOpenStruct animal="thing">>
irb(main):008:0> temp.name
=> "first"
irb(main):009:0> temp.place
=> #<MyOpenStruct animal="thing">
irb(main):010:0> temp["place"]
=> {"animal"=>"thing"}
irb(main):011:0> temp[:place]
=> {"animal"=>"thing"}
irb(main):012:0> temp
=> #<MyOpenStruct name="first", place=#<MyOpenStruct animal="thing">>
仅当我使用[] 访问密钥时,才会返回哈希!!
我该如何纠正这个问题??
【问题讨论】:
-
您的问题不清楚。你的目标是什么?您期望的输出是什么,而您得到的输出是什么?
-
我希望
temp.place返回一个哈希而不是MyOpenConstruct对象。压倒一切没有帮助。输入哈希可以比给定的更深。每个访问都应该返回一个哈希 -
如果您将其作为哈希返回,为什么要创建嵌套的 OpenStruct?
-
@Doguita 我如何获得对值的点访问?我的意思是
temp.name和temp[:name]不会相同。截至目前,两者都在工作。它只是我需要两者的哈希值。temp.name返回一个对象,但temp[:name]返回一个哈希 -
如果你想让
place返回不同的东西,那么你需要在你的子类中覆盖它。name也是如此。
标签: ruby openstruct