標準添付ライブラリ「set」を使う事で、集合を楽に扱う事ができます。
公式によると
集合とは重複のないオブジェクトの集まりです。 Array の持つ演算機能と Hash の高速な検索機能を合わせ持ちます。
との事なのでオブジェクトであれば何でも格納できます。
今回はHashの便利拡張Hashie::Mashを使って挙動を見て行きます。
基本的操作
基本的操作は配列と使い勝手が似ています。
pa = Hashie::Mash.new pa.power = 10 pa.name = "shuzo" pb = Hashie::Mash.new pb.power = 20 pb.name = "vivit" set = Set.new(pa, pb) #=> #<Set: {{"power"=>10, "name"=>"shuzo"}, {"power"=>20, "name"=>"vivit"}}>
Enumrableにもありますが・・・場合分けができます
set.divide {|v| v.power > 11} => #<Set: {#<Set: {{"power"=>10, "name"=>"shuzo"}}>, #<Set: {{"power"=>20, "name"=>"vivit"}}>}>
集合
ここで
pc = Hashie::Mash.new pc.name = "yamket" pc.power = "20" set2 = Set[pa, pc] #=> #<Set: {{"power"=>10, "name"=>"shuzo"}, {"name"=>"yamket", "power"=>"20"}}>
というモノを作ると、真価を発揮します。
et2 & set #=> #<Set: {{"power"=>10, "name"=>"shuzo"}}> set2 | set #=> #<Set: {{"power"=>10, "name"=>"shuzo"}, {"name"=>"yamket", "power"=>"20"}, {"power"=>20, "name"=>"vivit"}}>
あらかじめ、予期したsetをツッコんで比較するなりすれば
入り組んだロジックを書かずともよろしくやってくれます。