これつぐです。
あけましておめでとうございます。

# 話題に入りそこねてご無沙汰のあげく年も越してしまった……。


[ruby-dev:8798] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num)
> まつもと ゆきひろです

> 同じ抽出しているようにみえないんなら、いっそ既存のdelete_at
> を[] と同様のアクセスができるようにすべきか。
> 
>   (a = [1,2,3,4]).delete_at(0)        # => 1; a = [2,3,4]
>   (a = [1,2,3,4]).delete_at(0,2)      # => [1,2]; a = [3,4]
>   (a = [1,2,3,4]).delete_at(2..-1)    # => [3,4]; a = [1,2]

delete_at も悪くはないと思うんですが at が少々ひっかかります。
私の日本人的英語感覚だとどうも一点を指している気がしてしまって……。
「既存のメソッド」という観点からは indexes は使えないでしょうか?
たとえば delete_indexes とか indexes! とか。
# 前者は英語としてアレですけれど。
ただし indexes 風の名前だと必ず Array を返すことになりそうですけど……。


で、
そんなことを考えつつ Array#indexes をいじっていて気づいたのですが

[0, 1, 2, 3].indexes(0..2) => [[0, 1, 2]]

はちょっと嫌です。
個人的には [0, 1, 2] を返してほしいですが、
意図した仕様なのでしょうか?

ruby で書くと私の理解では
現状は

  class Array
    def indexes(*args)
      ary = []
      args.each{|i| ary << self[i]}
      ary
    end
  end

で、私の希望は

  class Array
    def indexes(*args)
      ary = []
!     args.each{|i| ary.concat(self[i])}
      ary
    end
  end

です。

以下、上記の修正のつもりのパッチです(自信なし)。

Index: ruby/array.c
===================================================================
RCS file: /home/cvs/ruby/array.c,v
retrieving revision 1.8
diff -u -r1.8 array.c
--- ruby/array.c	1999/12/14 06:49:39	1.8
+++ ruby/array.c	2000/01/02 17:00:40
@@ -483,7 +483,7 @@
 
     new_ary = rb_ary_new2(argc);
     for (i=0; i<argc; i++) {
-	rb_ary_push(new_ary, rb_ary_aref(1, argv+i, ary));
+	rb_ary_concat(new_ary, rb_ary_aref(1, argv+i, ary));
     }
 
     return new_ary;