配列の差分を取るメソッド − Array#diff
(追記:Array#-というメソッドがあるようです。id:yuguiさんありがとうございます)
二つの配列の比較をして、[レシーバー側にあったもの, 引数側にあったもの]を返すメソッドを作成してみました。どっかで見たことあるような気もする。。。
class Array def diff(other) self_diff = self.reject {|i| other.include? i} other_diff = other.reject {|j| self.include? j} return [self_diff, other_diff] end end a = [1, 2, 3, 4, 5] b = [1, 2, 3, 4, 5, 6] c = [1, 2, 3, 4, ] d = [1, 2, 3, 5, 6, 7] p b.diff(a) p a.diff(b) p c.diff(a) p a.diff(c) p d.diff(a) p a.diff(d) #=> [[6], []] [[], [6]] [[], [5]] [[5], []] [[6, 7], [4]] [[4], [6, 7]]
問題は、配列の中身が基本データ型じゃないとき。どうしよう…。。。
追記 15:39
使ってるのはEnumerable#rejectとEnumerable#include?だけなので別にArrayである必要はなさそう。
基本データ型以外で同じようなことをさせようとすると、そのクラスで==メソッドを定義すればそのまま使えそう。