是否有正当理由没有一种方法将标准Ruby结构的数据返回为哈希表(成员,值对)的形式?鉴于结构和哈希表具有非常相似的用例,我很惊讶为什么没有这样的方法存在。或者说,它确实存在,只是我太糊涂了?
实现这种功能很容易(我现在已经做到了),但标准库中缺乏此类功能,使我思考我可能并没有真正掌握Ruby中的结构概念。
是否有正当理由没有一种方法将标准Ruby结构的数据返回为哈希表(成员,值对)的形式?鉴于结构和哈希表具有非常相似的用例,我很惊讶为什么没有这样的方法存在。或者说,它确实存在,只是我太糊涂了?
实现这种功能很容易(我现在已经做到了),但标准库中缺乏此类功能,使我思考我可能并没有真正掌握Ruby中的结构概念。
Ruby <= 1.9.3具有OpenStruct#marshall_dump和Struct#each_pair功能:
Person = Struct.new(:name, :age)
person = Person.new("Jamie", 23)
person_hash = Hash[person.each_pair.to_a]
#=> {:age=>23, :name=>"Jamie"}
Ruby 2.0提供了Struct#to_h和OpenStruct#to_h:
Person = Struct.new(:name, :age)
person = Person.new("Jamie", 23)
person_hash = person.to_h
#=> {:age=>23, :name=>"Jamie"}
P = Struct.new(:x,:y)
p = P.new(1,2)
p.x # => x
编辑 2: 哈希表也可以用于快速查找对象。 obj_hashed_by_name[name]
比 obj_array.find { |a| a.name == name }
快得多。我猜我也不知道为什么你想这样做,但是:
s.members.inject({}) { |m, f| m[f] = s[f]; m }
each_with_object
:s.members.each_with_object({}) { |m, h| h[m] = s[m] }
被接受的答案对我不起作用,我使用了以下代替
require 'ostruct'
require 'date'
lid = OpenStruct.new(:status=>0,:rowversion=>0,:cre_dt=>DateTime.now.to_date,:cre_user=>'9999999')
p Hash[lid.each_pair.to_a] #=> {}
p lid.marshal_dump #=>{:status=>0, :rowversion=>0, :cre_dt=>#<Date: 2014-03-03 ((2456720j,0s,0n),+0s,2299161j)>, :cre_user=>"9999999"}