Bug in IPAddr eql? (stndard library)

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.

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

I would also consider it as a bug.

See: ri Object.eql

Martin

Thanks, Martin. I have been looking into this more. It seems that for
Sets, Hashes, and Arrays to work properly with an object, both .eql? and
.hash must be defined in that object. I wrote a patch that implements
both methods and sent it to Akinori Musha, the maintainer of IPAddr. He
will be including my patch or something similar the next version.