2011-11-10 15 views
15

標準のルビ構造体のデータをハッシュ(メンバー、値のペア)として返すメソッドがない妥当な理由はありますか? 構造体とハッシュが非常に似たユースケースを持っているのを見て、私はそのようなメソッドが存在しないことに驚いています。それとも、私はあまりにも盲目ですか?構造体データをルビのハッシュとして返します

実装が簡単です(私は今のところ行っていますが)。標準のlibsでこのような機能が不足していると、私はRubyの構造体の概念を本当に把握していないかもしれないと考えています。

答えて

30

(ルビー< = 1.9.3) OpenStructOpenStruct#marshall_dumpあり、Structは(ハッシュを取得するためにペアを取得するために使用to_aHash + to_aStruct#each_pairがあります

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

2.0物事は簡単です:Struct#to_hOpenStruct#to_h

Person = Struct.new(:name, :age) 
person = Person.new("Jamie", 23) 
person_hash = person.to_h 
#=> {:age=>23, :name=>"Jamie"} 
+0

OpenStructにはこのようなメソッドがあるというインフォーマントのために、この '注入のない'ソリューションともっと重要なことに感謝します。これはRuby Structの質問には実行可能なことです(明らかにそうです)。 – cvshepherd

+4

Ruby 2.0には構造体にto_hメソッドがあります。 –

4

ハッシュと構造体のユースケースは非常に似ているとは思えません。ハッシュを使用すると、さまざまな数のキーと値のペアを格納でき、必要に応じて何千ものペアを格納するのに適しています。特定のキーは存在しないことが保証されています。構造体では、 "キー"のセットが何であるかを常に知っており、通常は小さく(20未満)です。

ハッシュを使用すると、いくつかの情報を多数の異なるオブジェクトに関連付けることができます。ハッシュは、関数へのオプションのパラメーターを指定するために使用されます。構造体は、明確に定義された情報を1つのオブジェクトにまとめる場合に使用できます。

私は構造体からハッシュに変換したかったことがないので、なぜあなたがしているのだろうかと思います。

EDIT 1: Structsでこのハッシュのような構文を使用できますか?

P = Struct.new(:x,:y) 
p = P.new(1,2) 
p.x # => x 

EDIT 2:ハッシュもすばやくオブジェクトをルックアップするために使用することができます。 obj_hashed_by_name[name]は、obj_array.find { |a| a.name == name }よりはるかに高速です。

+1

私はまだ理由では見られない使用しましたメンバ、値のペアをハッシュとして取り出すことができません。特に構造体が配列のように動作することで何の問題もないことを考慮すると、私は時々きちんと見つけますが、文脈のない構造体(メンバ)の値はほとんど無用です。 – cvshepherd

2

私はあなたがどちらかそれをやりたいと思いますなぜ私にはわからないと思いますが、:each_with_object使用

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

または、:

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

私が必要とする/これを必要とする理由は、ハッシュが非常にうまくいく値でソートできることです。 – cvshepherd

+1

@cvshepherdああ。私はクラスを使用していただろうと思うが、今はそれを得るだろう:) –

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"} 
関連する問題