From: "agrimm (Andrew Grimm)" Date: 2014-01-02T09:11:39+09:00 Subject: [ruby-core:59457] [ruby-trunk - Bug #9340][Open] Document order related behavior in Array#uniq Issue #9340 has been reported by agrimm (Andrew Grimm). ---------------------------------------- Bug #9340: Document order related behavior in Array#uniq https://bugs.ruby-lang.org/issues/9340 Author: agrimm (Andrew Grimm) Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux] Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN The behavior of Array#uniq without a block in Ruby 2.1.0 is inconsistent with the behavior of Array#uniq in Ruby 2.0.0, and with the behavior of Array#uniq with a block in Ruby 2.1.0. Array#uniq without a block in Ruby 2.1.0 returns the last item that is duplicate, while everything else returns the first item that is duplicate. class Person attr_reader :name def initialize(id, name) # @id is not used by hash or eql? @id = id @name = name end def hash [@name].hash end def eql?(other) [@name].eql?([other.name]) end end p1 = Person.new(1, "Bob") p2 = Person.new(2, "Bob") p3 = Person.new(3, "Bob") arr = [p1, p2, p3] arr2 = arr.uniq {|p| p} arr3 = arr.uniq p RUBY_VERSION p arr2 p arr3 Gives "2.1.0" [#] [#] "2.0.0" [#] [#] This behavior does not contradict what RDoc says about Array#uniq, so people ought not to rely upon which duplicate item is chosen. However, at the very least, different behavior for Array#uniq with and without a block would be somewhat unexpected. Should the documentation explicitly warn that uniq is not guaranteed to choose the first duplicate item? As Ruby 2.1.0 has already been released, I assume it is too late to change the behavior of Array#uniq . -- http://bugs.ruby-lang.org/