RubySpec #3401

arrays containing them selves do not apply == sensibly.

Added by dmt10 (Dominic Tarr) almost 2 years ago. Updated about 1 year ago.

[ruby-core:30628]
Status:Rejected Start date:06/07/2010
Priority:Normal Due date:
Assignee:- % Done:

0%

Category:lib
Target version:-

Description

a = [:a]
a << a
puts a
=> [:a [...]]

b = [:a]
b << b
puts b
=> [:a [...]]

#so , a == b?
puts a == b
=> false

#but they have the same structure...
puts a.to_yaml == b.to_yaml
=> true

#it looks like == compares the object_id's of arrays within arrays.
#more evidence:

c = [:a]
c << a
puts c
=> [:a, [:a, [...]]]
#clearly, a distinctly different array.
puts a == c
=> true
puts a.to_yaml == c.to_yaml
=> false

#this seems surprising behaviour to me

History

Updated by ujihisa (ujihisa .) almost 2 years ago

FYI ruby 1.9 changed this behavior

    $ ruby193 -ve 'a=[:a];a<<a;b=[:a];b<<b;p a;p b;p a==b'
    ruby 1.9.3dev (2010-06-06 trunk 28190) [i386-darwin9.8.0]
    [:a, [...]]
    [:a, [...]]
    true

Updated by marcandre (Marc-Andre Lafortune) almost 2 years ago

  • Status changed from Open to Rejected
Ruby 1.9's treatment of recursive structures has been set so that two structures are equal if they contain the elements that are equal, or said otherwise if no difference can be found between them. If you can give a "path" x, y, z..., such that a[x][y][z] != b[x][y][z], then and only then will a != b.

In your example, c[0] == a[0], c[1] == a[1] and c.size == a.size, so c == a.

Also available in: Atom PDF