

下記のような中身がクラスオブジェクトの２つの配列があり、その差集合を取りたいです

[code]

    foo_people
    #=> [#<Person:0x007fd36402cee0> @name="ichiro", #<Person:0x007fd36484c940> @name="jiro", #<Person:0x007fd364aac118> @name="saburo"]
    bar_people
    #=> [#<Person:0x007fd364a6f3a8> @name="ichiro", #<Person:0x007fd364a36170> @name="jiro"]
    
[/code]

イメージとしては下記のような形ですが、object_id が異なるために差分を取得できなくて困っています。

[code]

    foo_people - bar_people
    #=> [#<Person:0x007fd364aac118> @name="saburo"]
    
[/code]


CC BY-SA 4.0
2018-10-12T15:11:04.260
49227
2018-10-17T04:13:48.027
2018-10-17T04:13:48.027
19110
30499
question
ruby
中身がクラスオブジェクトの Array をクラスオブジェクトのママで差集合


はじめまして。`Array#-`は、アイテムの比較に`Object#eql?`を使うので  
`Person`クラスに、`eql?`メソッドを定義して同一性を保証する必要があります。  
また、`eql?`メソッドを定義した場合は`hash`メソッドも定義する必要があるので、そちらも忘れずに定義して下さい。

今回の例だと、`Person`クラスに（`@name`というメンバーしかないという前提ですが）、

[code]

    def eql? (other)
        other.name == @name
    end
    
    def hash
        @name.hash
    end
    
[/code]

を追記してあげれば目的通り、オブジェクトIDが異なっても内容が同じなら配列の差分が作成されます。

`@name`以外にもメンバーを持っているのであれば、hashはもう少し賢く定義して下さい。（メンバーを全て文字列にして結合した文字列のhash値を返すとか・・・）


CC BY-SA 4.0
2018-10-12T17:10:25.713
49228
2018-10-12T17:10:25.713
14745
49227
answer