Bug #8739
closedRange#last と#last(n)で挙動の統一がされていない
Description
Range#lastは終端を返しますが、#last(n)は最後の要素を返します。
引数の有無で挙動が異なるのは意図したものでしょうか?
意図したものであれば、返す値を終端か要素どちらかに挙動を統一出来ないでしょうか。
#終端が返る
(1...5).last => 5
#最後の要素が返る
(1...5).last(1) => [4]
Updated by matz (Yukihiro Matsumoto) over 11 years ago
- Status changed from Open to Rejected
- Assignee set to matz (Yukihiro Matsumoto)
意図したものです。
引数がない時には「終端」が欲しいでしょうし、引数を指定して複数値を取り出す時に、eachで登場しない値を含めるものおかしいと思いました。
仮に変えるとして「どちらかに揃える」ことを希望されるならば、どちらに揃えるべきだとも思いますか?
その時に「揃える」ことが現状の動作よりどう嬉しいのか、非互換性を導入するだけの価値があるのか教えてください。
Matz.
Updated by matz (Yukihiro Matsumoto) over 11 years ago
- Status changed from Rejected to Closed
むむ、リビジョン 42400で最後の要素を返す(結果として挙動を揃える非互換な方向の)変更が行われてますね。
これを機会に改めて考えると、終端は「end」メソッドを使うようにして、「last」の挙動は他のEnumerableと揃えることにしましょう。
非互換ですが、なんとかなる、でしょう、多分。
標準添付ライブラリにあった非互換問題は、リビジョン 42403、42404、42407で修正されています。
ちょっと押し切られた感じですが、まあ、長い目で見ればこれで良かったんでしょう、きっと。
Matz.
Updated by naruse (Yui NARUSE) over 11 years ago
- Status changed from Closed to Assigned
- Assignee changed from matz (Yukihiro Matsumoto) to nobu (Nobuyoshi Nakada)
- Target version set to 2.1.0
仕様を変えるときは NEWS に書いて下さい。
あと、rdoc もちゃんと追従させて下さい。
Updated by naruse (Yui NARUSE) over 11 years ago
なんかrubyspecのこけ方がおかしいと思ったのでよく見てみたら、rubyspec自体(=mspec)が
Range#last を ruby_version_is "1.9"..."1.9.3" とかの判定で使っているようで、
見事に踏んだようです。
http://c64b.rubyci.org/~chkbuild/ruby-trunk/log/20130806T090301Z.diff.html.gz
最低でも移行措置必要じゃないですかねぇ。
Updated by kosaki (Motohiro KOSAKI) over 11 years ago
だれかが、ギャっと言ったら君主豹変スで態度を変えてrevertすべきなんじゃないですかねえ。
Updated by naruse (Yui NARUSE) over 11 years ago
- Priority changed from Normal to 5
kosaki (Motohiro KOSAKI) wrote:
だれかが、ギャっと言ったら君主豹変スで態度を変えてrevertすべきなんじゃないですかねえ。
だいたい「ぎゃっ」というのはリリース後な上に、だいたいblogやtwitterでの愚痴として露出することになるところ、
標準ライブラリでの2件に加えてrubyspec (mspec)も踏んでるあたり、これはもう予告無しでの変更はアウトだろうと思うんですよ。
柴田さん側での見解も聞きますかね。
Updated by nobu (Nobuyoshi Nakada) over 11 years ago
Rejectされているの気づかず、うっかり変更してしまいましたが、revertしますかねぇ。
ただし、net/http/header.rbのように、last(1)[0]と同じモノが欲しいケースはあるのではないかと思います。
rubyspectの件は、("1.9"..."1.9.3").to_aを使うのはまずいってことですねぇ。
やっぱりrevertかな。
Updated by to_ueda (Tomoya Ueda) over 11 years ago
コメントいただきありがとうございます。
リビジョン 42400の変更のようになると、直感的でうれしいとは思いましたが、
「非互換性を導入するだけの価値」をあまり念頭に置いていない上での発言でした。
揃えてほしいという意見は変わりませんが、
非互換の影響を目にし、それ以上のメリットを私には説明することもできません。
ご判断お願い致します。
Updated by nobu (Nobuyoshi Nakada) over 11 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r42431.
Tomoya, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
range.c: revert r42400
- range.c (range_last): revert r42400. [Bug #8739]
Updated by hsbt (Hiroshi SHIBATA) over 11 years ago
呼ばれたので返事をすると、2.1.0 で warning 出して 2.1.1 で変えるか、2.0.x で warning 出して 2.1 で変えるというところが妥当と思いますが、後者はもう期限切れな気がします。