配列の差分を取るメソッド − 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である必要はなさそう。

基本データ型以外で同じようなことをさせようとすると、そのクラスで==メソッドを定義すればそのまま使えそう。