将struct数据作为ruby中的哈希返回
是否有正当理由没有方法将标准ruby结构的数据作为哈希(成员,值对)返回? 看到结构和散列具有非常相似的用例,我很惊讶没有这样的方法存在。 或者是这样,我太盲目了?
它很容易实现(我现在已经这样做了),但是在标准库中缺少这样的function,让我觉得我可能还没有真正掌握ruby中的结构概念。
(Ruby <= 1.9.3) OpenStruct
有OpenStruct#marshall_dump , Struct
有struct#each_pair (使用to_a
获取对, Hash
+ to_a
获取哈希):
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"}
我不认为哈希和结构的用例非常相似。 哈希允许您存储可变数量的键值对,并且适合存储数千对(如果您需要)。 没有特别的钥匙保证存在。 使用Struct,您始终知道“键”的设置是什么,通常很小(小于20)。
哈希可用于将某些信息与大量不同的对象相关联。 哈希用于指定函数的可选参数。 当您想在一个对象中保留一些明确定义的信息时,可以使用结构。
我从来没有想过从结构转换为哈希,所以我想知道你为什么这样做。
编辑1 :你知道你可以在Structs中使用这种类似哈希的语法吗?
P = Struct.new(:x,:y) p = P.new(1,2) px # => x
编辑2 :哈希也可用于快速查找对象。 obj_hashed_by_name[name]
可以比obj_array.find { |a| a.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=>#, :cre_user=>"9999999"}