Ruby集合类:集合的平等
根据Ruby Set类的文档,“==如果两个集合相等,则返回true。每个元素的相等性根据Object#eql?定义。
可以使用Date对象来演示其本质,其中包含不同Date对象但具有相同日期比较的集合:
require 'set'
d1 = Date.today              # => Thu, 30 Sep 2010
puts d1.object_id            # => 2211539680
d2 = Date.today + 1          # => Fri, 01 Oct 2010
puts d2.object_id            # => 2211522320
set1 = Set.new([d1, d2])
d11 = Date.today             # => Thu, 30 Sep 2010
puts d11.object_id           # => 2211489080
d12 = Date.today + 1         # => Fri, 01 Oct 2010
puts d12.object_id           # => 2211469380
set2 = Set.new([d12, d11])
set1 == set2                 # => true
但是使用我自己的对象,我在哪里编写了eql? 方法来只比较某些属性,我不能让它工作。
class IpDet
    attr_reader :ip, :gateway
    def initialize(ip, gateway, netmask, reverse)
        @ip = ip
        @gateway = gateway
        @netmask = netmask
        @reverse = reverse
    end
    def eql?(other)
        if @ip = other.ip && @gateway == other.gateway
            return true
        else
            return false
        end
    end
end
ipdet1 = IpDet.new(123456, 123457, 123458, 'example.com')
ipdet2 = IpDet.new(234567, 2345699, 123458, 'nil')
ipdet11 = IpDet.new(123456, 123457, 777777, 'other_domain.com')
ipdet12 = IpDet.new(234567, 2345699, 777777, 'example.com')
puts "ipdet1 is equal to ipdet11: #{ipdet1.eql?(ipdet11)}"
puts "ipdet2 is equal to ipdet12: #{ipdet2.eql?(ipdet12)}"
set1 = Set.new([ipdet1, ipdet2])
set2 = Set.new([ipdet11, ipdet12])
puts "set 1 is equal to set2: #{set1 == set2}"
我从上面得到的结果是:
ipdet1 is equal to ipdet11: true
ipdet2 is equal to ipdet12: true
set 1 is equal to set2: false
任何想法的人?
  当你重写eql?  ,您也总是需要重写hash ,以便如果o1.eql?(o2)为true,则o1.hash == o2.hash也是如此。 
例如,你的哈希方法可能看起来像这样:
def hash
  [@ip, @gateway].hash
end
  你的eql?还有一个错字eql?  方法: @ip = other.ip应该是@ip == other.ip 。 
  也是一个小样式: if condition then true else false end等于只是condition ,所以你的eql?  方法可以被定义为 
def eql?(other)
  @ip == other.ip && @gateway == other.gateway
end
