あおきです。

  In mail "[ruby-dev:8830] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num)"
    matz / netlab.co.jp (Yukihiro Matsumoto) wrote:

> まつもと ゆきひろです

> |> この場合、delete_atはどうします?
> |
> |西さんへの返事を書いている最中で、やっぱり delete_at( i, len ) も
> |欲しいと思いました。
> 
> ま、気持ちは分かります。

ふ、2 時間かけて考えた甲斐があった…。


> |それで提案なんですが、delete_at( i, len ) を self かなにかを返すように
> |実装して、slice! を返り値も返す版にしたらどうでしょうか?
> |delete_at(i) は現在の仕様のままで、ドキュメントからは返り値の記述を外す。
> |で、slice!(i) を許すようにして破壊的取り出しはこっちに揃えればばっちり。
> 
> えーと、整理すると、あおき案は
(略)
> なんですか? delete_at(n)が良く分からなかった。
> 私は
(略)
> ってのを考えてたんですが。

delete_at( n, len ) で必ず配列が生成されるのがいやなひとが
いるかと思ったのがそもそもの発端で、このさい delete_at は
削除するだけのメソッドに徹したらどうかと考えました。
ただ、delete_at( index ) は互換性を考えると
削除した要素を返すほうがいいと思うので現行のままにしておく。
ただし、これからは返り値がほしいときは slice! を使うことを推奨と
いう意味で、ドキュメントからは削除しておいたらどうだろうか。

という意図でした。複雑ですみません。
あらためて整理するとこうです。

delete_at( index )
  削除した要素を返す  --> 将来のバージョンでは self を返す。
delete_at( index, len )/delete_at( range )
  範囲を削除する。self を返す。

alias slice []

slice!( index )
  要素を削除してそれを返す。
slice!( index, len )/slice!( range )
  範囲を削除してそれを(配列で)返す。

つまり、slice! と delete_at は返り値だけが違うメソッドということです。
-------------------------------------------------------------------
あおきみねろう