Project

General

Profile

Actions

Bug #8739

closed

Range#last と#last(n)で挙動の統一がされていない

Added by to_ueda (Tomoya Ueda) over 11 years ago. Updated over 11 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 2.1.0dev (2013-08-05) [x86_64-linux]
[ruby-dev:47587]

Description

Range#lastは終端を返しますが、#last(n)は最後の要素を返します。
引数の有無で挙動が異なるのは意図したものでしょうか?
意図したものであれば、返す値を終端か要素どちらかに挙動を統一出来ないでしょうか。

#終端が返る
(1...5).last => 5
#最後の要素が返る
(1...5).last(1) => [4]

Actions #1

Updated by matz (Yukihiro Matsumoto) over 11 years ago

  • Status changed from Open to Rejected
  • Assignee set to matz (Yukihiro Matsumoto)

意図したものです。

引数がない時には「終端」が欲しいでしょうし、引数を指定して複数値を取り出す時に、eachで登場しない値を含めるものおかしいと思いました。

仮に変えるとして「どちらかに揃える」ことを希望されるならば、どちらに揃えるべきだとも思いますか?
その時に「揃える」ことが現状の動作よりどう嬉しいのか、非互換性を導入するだけの価値があるのか教えてください。

Matz.

Actions #2

Updated by matz (Yukihiro Matsumoto) over 11 years ago

  • Status changed from Rejected to Closed

むむ、リビジョン 42400で最後の要素を返す(結果として挙動を揃える非互換な方向の)変更が行われてますね。

これを機会に改めて考えると、終端は「end」メソッドを使うようにして、「last」の挙動は他のEnumerableと揃えることにしましょう。
非互換ですが、なんとかなる、でしょう、多分。

標準添付ライブラリにあった非互換問題は、リビジョン 42403、42404、42407で修正されています。

ちょっと押し切られた感じですが、まあ、長い目で見ればこれで良かったんでしょう、きっと。

Matz.

Actions #3

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 もちゃんと追従させて下さい。

Actions #4

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

最低でも移行措置必要じゃないですかねぇ。

Actions #5

Updated by kosaki (Motohiro KOSAKI) over 11 years ago

だれかが、ギャっと言ったら君主豹変スで態度を変えてrevertすべきなんじゃないですかねえ。

Actions #6

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)も踏んでるあたり、これはもう予告無しでの変更はアウトだろうと思うんですよ。
柴田さん側での見解も聞きますかね。

Actions #7

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かな。

Actions #8

Updated by to_ueda (Tomoya Ueda) over 11 years ago

コメントいただきありがとうございます。

リビジョン 42400の変更のようになると、直感的でうれしいとは思いましたが、
「非互換性を導入するだけの価値」をあまり念頭に置いていない上での発言でした。

揃えてほしいという意見は変わりませんが、
非互換の影響を目にし、それ以上のメリットを私には説明することもできません。

ご判断お願い致します。

Actions #9

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]
Actions #10

Updated by hsbt (Hiroshi SHIBATA) over 11 years ago

呼ばれたので返事をすると、2.1.0 で warning 出して 2.1.1 で変えるか、2.0.x で warning 出して 2.1 で変えるというところが妥当と思いますが、後者はもう期限切れな気がします。

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0