笠原です。こんにちは。 私> Array クラスにはインデックスの表現に start..end や start, length が使 私> えるメソッドがありますが、start, end がともに負で、かつ両方とも `配列 私> の長さ * (-1)' よりも小さいときのときの挙動がどうもよく分かりません。 という上記の私の疑問に対して、小田さん、まつもとさんから、回答を頂きま した。どうもありがとうございます。 * From: matz / netlab.co.jp (Yukihiro Matsumoto) * Date: Tue, 27 Oct 1998 17:16:54 +0900 > * start or endが負の時には「配列の長さ+(start or end)」と > みなします > > * さらに「配列の長さ+(start or end)」がまだ負の時には0とみ > なします. なるほど、こうなっているのですね。(同様に小田さんも 0 とみなされるとい うことは書かれていました。) ただ、個人的には、 a = ['a', 'b', 'c'] a[-6..-5] = ['X', 'Y'] # a => ['X', 'Y', nil, 'a', 'b', 'c'] という結果になると、代入直後は a[-6..-5] が ['X'、'Y'] になるので、もっ とも自然だと思えるのですが、どうでしょう。それから、 > * さらに「配列の長さ+(start or end)」がまだ負の時には0とみ > なします. このルールはインデックスとして引数に srart..end や start, length をと るメソッドに限って採用されているのですよね? delete_at(index) や self[nth] といったメソッドでは、このルールは適当されないようです。とく に `self[nth] = value' メソッドは例外が発生します。例外が発生するのは このメソッドだけのようです。 a = [0, 1, 2] a[-4] = 10 # 例外: negative index for array (IndexError) なんとなく、一見同じようにみえる以下の 3 つの処理 a[-4] = 10 a[-4, 1] = [10] a[-4..-4] = [10] がすべて異なる結果になるのが気になるのは、私だけでしょうか。(^^;) ところで、引数 start, length の length が負のときは、常に例外が発生す ると思っていたのですが、start の値によって挙動が変わります。 a = [0, 1, 2] a[0, -2] = ['a', 'b'] # 例外: negative length 3 (IndexError) a = [0, 1, 2] a[4, -2] = ['a', 'b'] # a => [0, 1, 2, nil, 'a', 'b'] これは何故なのでしょうか。 ______________________________________________________________________ 笠原 基之(かさはら もとゆき)