Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

標準ライブラリ「set」で集合を扱う(その1)

標準添付ライブラリ「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をツッコんで比較するなりすれば
入り組んだロジックを書かずともよろしくやってくれます。

参考もと