質問: [{a: 1, b: 2}, {a: 1, b: 3}] ``` これを以下のようにブロックを使った`uniq`メソッドで 統合した時に先頭の要素が残るのですが、 ``` a.uniq{|i| i.values_at(:a)} # => {a: 1, b: 2} ``` このように「先頭に近い要素が残る」という動作は保証されていますか? ドキュメントを確認してみたのですが、明確な記述が見つけられませんでした。
回答: ruby 2.3のドキュメントでは以下のように書かれています。なので「先頭に近い要素が残る」という動作は保証されています。 > > self is traversed in order, and the first occurrence is kept. > > > > > ただし、ruby 2.2のドキュメントでは特に記述されていないように見えました。 調べてみたところ、2.3には以下のドキュメントの改善が取り込まれているようです。 プルリクエストのdescriptionによれば2.3以前でもtest_array.rbに「先頭に近い要素が残る」動作のテストがあるようです。 > > It's not guaranteed in the docs that for the method works like this: > > [1,2,3,4,5].uniq {|x| x.odd? } #=> [1, 2] > > but there is a test for it in test_array.rb and jruby seems to also visit array elements in order. > > > > > お使いのRubyのドキュメントに「先頭に近い要素が残る」動作についての記述がない場合は、「先頭に近い要素が残る」動作のテストがあるかどうか確認してみてはいかがでしょうか。