Bug #11385
closed
`==` with bidirectional/cyclic dependency
Added by allenwq (Allen Wang) over 9 years ago.
Updated over 9 years ago.
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
test.rb (226 Bytes)
test.rb |
Code to recreate the bug |
allenwq (Allen Wang), 07/22/2015 02:50 AM
|
|
- Description updated (diff)
- Status changed from Open to Rejected
true
is the expected result, and the same with x64-mswin64_120.
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)
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!)
my version is "ruby 2.3.0dev (2015-07-21 trunk 51319) [x86_64-linux]"
and it does return true for me too
- Related to Bug #1448: [patch] Proper handling of recursive arrays added
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0Like0Like0