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 10 years ago
          Updated by nobu (Nobuyoshi Nakada) over 10 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 10 years ago
          Updated by lowjoel (Joel Low) over 10 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 10 years ago
          Updated by Eregon (Benoit Daloze) over 10 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 10 years ago
          Updated by Hanmac (Hans Mackowiak) over 10 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 10 years ago
          Updated by Eregon (Benoit Daloze) over 10 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 10 years ago
          Updated by Eregon (Benoit Daloze) over 10 years ago
          
          
        
        
      
      - Related to Bug #1448: [patch] Proper handling of recursive arrays added