[#44904] [ruby-trunk - Bug #5688][Open] Solaris10 で spawn を繰り返すとメモリリークする — okkez _ <redmine@...>

14 messages 2011/11/29

[ruby-dev:44830] [ruby-trunk - Feature #5584] Array#sample!

From: Masaki Matsushita <glass.saga@...>
Date: 2011-11-08 06:39:33 UTC
List: ruby-dev #44830
Issue #5584 has been updated by Masaki Matsushita.


Mon, 7 Nov 2011 22:53:21 Yusuke Endoh <mame tsg.ne.jp>:
>sample! という名前が最大のネックのようですので、他の名前をえるといいと思います。

思いつくものとしてはpickやdrawといったところでしょうか。
個人的にはpickがしっくりきます。

Tue, 8 Nov 2011 00:44:07 近藤 充弘 <miche mac.com>:
>Enumeratorを使ったほうが直感的だと思います

Enumerator#nextでは列挙状態が進みますが、Enumerable#takeでは進まないという問題があります。

a = (1..10).to_a.shuffle.each
a.take(3) #=> [10, 2, 6]
a.take(3) #=> [10, 2, 6]
----------------------------------------
Feature #5584: Array#sample!
http://redmine.ruby-lang.org/issues/5584

Author: Masaki Matsushita
Status: Open
Priority: Normal
Assignee: 
Category: core
Target version: 2.0.0


=begin
ランダムに選択した要素をレシーバから取り除いて返すメソッドArray#sample!の追加を提案します。

配列からランダムに要素を取り出したい場合には

 a = (1..5).to_a
 a.delete_at(rand(a.size)) #=> 3
 p a #=> [1, 2, 4, 5]
 
などと書く必要がありましたが、Array#sample!があれば

 a = (1..5).to_a
 a.sample! #=> 4
 p a #=> [1, 2, 3, 5]

と簡潔に書く事ができます。

引数を指定した場合は、その数だけレシーバから要素を取り除き、新たな配列に取り除いた要素を入れて返します。

 a = (1..10).to_a
 p a.sample!(5) #=> [5, 4, 2, 6, 7]
 p a #=> [1, 3, 8, 9, 10]

レシーバから選択した要素を取り去ってしまう事以外は、Array#sampleと同じ動作をします。

 [].sample! #=> nil
 [].sample!(1) #=> []
 [1,2,3].sample!(random: rand) #=> 2

patchを添付します。
=end


-- 
http://redmine.ruby-lang.org

In This Thread