笠原です。こんにちは。

私> 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']

これは何故なのでしょうか。
______________________________________________________________________
                                          笠原 基之(かさはら もとゆき)