将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"}