将struct数据作为ruby中的哈希返回

时间:2011-11-10 16:02:17

标签: ruby

是否有正当理由没有方法将标准ruby结构的数据作为哈希(成员,值对)返回? 看到结构和散列具有非常相似的用例,我很惊讶没有这样的方法存在。或者是这样,我太盲目了?

它很容易实现(我现在已经这样做了),但是在标准库中缺少这样的功能,让我觉得我可能没有真正掌握ruby中的结构概念。

4 个答案:

答案 0 :(得分:34)

(Ruby< = 1.9.3)OpenStructOpenStruct#marshall_dumpStructStruct#each_pair(使用to_a来获取对{{1} +} + Hash来获取哈希值:

to_a

使用Ruby 2.0,事情变得更容易:Struct#to_hOpenStruct#to_h

Person = Struct.new(:name, :age)
person = Person.new("Jamie", 23)
person_hash = Hash[person.each_pair.to_a]
#=> {:age=>23, :name=>"Jamie"}

答案 1 :(得分:4)

我认为哈希和结构的用例非常相似。哈希允许您存储可变数量的键值对,并且适合存储数千对(如果您需要)。没有特别的钥匙保证存在。使用Struct,您总是知道“键”的组合,通常很小(小于20)。

哈希可用于将某些信息与大量不同的对象相关联。哈希用于指定函数的可选参数。当您想在一个对象中保留一些明确定义的信息时,可以使用结构。

我从来没有想过从结构转换为哈希,所以我想知道你为什么这样做。

编辑1 : 您是否知道可以在Structs中使用这种类似哈希的语法?

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 }快得多。

答案 2 :(得分:2)

我想我也不知道你为什么要这样做,但是:

s.members.inject({}) { |m, f| m[f] = s[f]; m }

或者,使用each_with_object

s.members.each_with_object({}) { |m, h| h[m] = s[m] }

答案 3 :(得分:0)

接受的答案对我不起作用,我使用以下代码

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