27478


例えば次のような配列があり

[code]

    a = [{a: 1, b: 2}, {a: 1, b: 3}]
    
[/code]

これを以下のようにブロックを使った`uniq`メソッドで  
統合した時に先頭の要素が残るのですが、

[code]

    a.uniq{|i| i.values_at(:a)}
    # => {a: 1, b: 2}
    
[/code]

このように「先頭に近い要素が残る」という動作は保証されていますか？

ドキュメントを確認してみたのですが、明確な記述が見つけられませんでした。  
<http://ruby-doc.org/core-2.2.0/Array.html>


CC BY-SA 3.0
2016-07-09T09:55:07.477
27476
2016-07-09T10:10:51.107
3271
question
ruby
Array#uniq のブロックで条件を指定した時に最初の要素が保持されるのは保証されていますか？


ruby 2.3のドキュメントでは以下のように書かれています。なので「先頭に近い要素が残る」という動作は保証されています。

> self is traversed in order, and the first occurrence is kept.  
>  <http://ruby-doc.org/core-2.3.0/Array.html#method-i-uniq>

ただし、ruby 2.2のドキュメントでは特に記述されていないように見えました。  
<http://ruby-doc.org/core-2.2.0/Array.html#method-i-uniq>

調べてみたところ、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.  
>  <https://github.com/ruby/ruby/pull/845>

お使いのRubyのドキュメントに「先頭に近い要素が残る」動作についての記述がない場合は、「先頭に近い要素が残る」動作のテストがあるかどうか確認してみてはいかがでしょうか。


CC BY-SA 3.0
2016-07-09T10:10:51.107
27478
2016-07-09T10:10:51.107
2599
27476
answer