Hi,

.eql? is implemented in Object - the parent of IPAddr. According to the
docs '==' is synonymous with 'eql?' in Object. Now IPAddr has it's own
implementation of '==' but doesn't touch the 'eql?' method.

This should quick fix your problem:

 class IPAddr
  def eql?(other)
     self == other
   end
 end


I would also consider it as a bug.

See: ri Object.eql

Martin

On Tue, 2009-07-28 at 03:50 +0900, Nick Brown wrote:
> The .eql? method is supposed to return true if the objects are == and of
> the same class, correct? This is *not* the case with IPAddr objects.
> 
> irb(main):001:0> require 'ipaddr'
> => true
> irb(main):002:0> a = IPAddr.new('1.1.1.1')
> => #<IPAddr: IPv4:1.1.1.1/255.255.255.255>
> irb(main):003:0> b = IPAddr.new('1.1.1.1')
> => #<IPAddr: IPv4:1.1.1.1/255.255.255.255>
> irb(main):004:0> a == b
> => true
> irb(main):005:0> a.eql? b
> => false
> irb(main):006:0> a == b and a.class == b.class
> => true
> 
> Clearly, the value of "a.eql? b" should be true, not false.
> 
> This bug breaks several things. In my case, it causes Sets of IPAddr
> objects to contain duplicates, angering the gods of mathematics.