Bug #11385
closed`==` with bidirectional/cyclic dependency
Description
class Something
attr_accessor :friend
def initialize(friend)
self.friend = friend
end
def ==(other)
friend == other.friend
end
end
a = Something.new([])
b = Something.new([a])
a.friend = [b]
a == b
The above code returns true on OS X and Linux, by right it should give me a exception of stack level too deep.
( And on windows I can see the expected exception )
Files
Updated by nobu (Nobuyoshi Nakada) over 9 years ago
- Description updated (diff)
- Status changed from Open to Rejected
true
is the expected result, and the same with x64-mswin64_120.
Updated by lowjoel (Joel Low) over 9 years ago
Hi Nakada-san:
D:\> ruby -v
ruby 2.2.3p147 (2015-07-04 revision 51143) [x64-mswin64_120]
D:\> ruby test.rb
test.rb:8:in `==': stack level too deep (SystemStackError)
from test.rb:8:in `=='
from test.rb:8:in `=='
from test.rb:8:in `=='
from test.rb:8:in `=='
from test.rb:8:in `=='
from test.rb:8:in `=='
from test.rb:8:in `=='
from test.rb:8:in `=='
... 2574 levels...
from test.rb:8:in `=='
from test.rb:8:in `=='
from test.rb:8:in `=='
from test.rb:17:in `<main>'
It seems to be a problem specific to Windows. The test suite passes (IIRC)
Updated by Eregon (Benoit Daloze) over 9 years ago
Should the result not be false instead?
These two instances each have a different @friend and it cannot be determined if they are equal so "false" seems a much safer answer.
Also, this seems inconsistent to how Comparable#== treat such cases:
class Something
attr_accessor :friend
def initialize(friend)
self.friend = friend
end
include Comparable
def <=>(other)
friend <=> other
end
end
a = Something.new([])
b = Something.new([a])
a.friend = [b]
p a == b # false (and not true like above!)
Updated by Hanmac (Hans Mackowiak) over 9 years ago
my version is "ruby 2.3.0dev (2015-07-21 trunk 51319) [x86_64-linux]"
and it does return true for me too
Updated by Eregon (Benoit Daloze) over 9 years ago
#1448 and the specs in
https://github.com/ruby/rubyspec/blob/master/core/array/shared/eql.rb
convinced me this is desirable behavior.
Updated by Eregon (Benoit Daloze) over 9 years ago
- Related to Bug #1448: [patch] Proper handling of recursive arrays added