Gotoken proposed code for Array#insert: > How about this? > > class Array > def insert(pos, *obj) > self[pos,0] = obj > self > end > end > > a = [1,2,3] ; a.insert(1, [4, 5]) ; p a #=> [1, [4, 5], 2, 3] > a = [1,2,3] ; a.insert(1, 4, 5 ) ; p a #=> [1, 4, 5, 2, 3] > I like it. So here's a (equivalent?) patch which produces a=[1,2,3]; a.insert(1, [4,5]); p a; [1, [4, 5], 2, 3] a=[1,2,3]; a.insert(1, 4,5); p a; [1, 4, 5, 2, 3] a=[1,2,3]; a.insert(-1, [4,5]); p a; [1, 2, [4, 5], 3] a=[1,2,3]; a.insert(4, [4,5]); p a; [1, 2, 3, nil, [4, 5]] a=[1,2,3]; a.insert(-4, [4,5]); p a; -e:1:in `insert': index -4 out of array (IndexError) from -e:1 a=[1,2,3]; a.insert(1); p a; -e:1:in `insert': wrong # of arguments (1 when 2 required) (ArgumentError) from -e:1 a=[1,2,3]; a.insert([4,5], 1); p a; -e:1:in `insert': Argument position is not a fixnum (ArgumentError) from -e:1 Approved? - Aleksi [niemela@mercury ruby]$ cvs diff -u array.c Index: array.c =================================================================== RCS file: /home/cvs/ruby/array.c,v retrieving revision 1.30 diff -u -r1.30 array.c --- array.c 2000/10/10 07:03:15 1.30 +++ array.c 2000/10/19 16:52:05 @@ -617,6 +617,30 @@ return argv[1]; } +static VALUE +rb_ary_insert(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; +{ + VALUE objects; + long pos; + + if (argc < 2) { + rb_raise(rb_eArgError, "wrong # of arguments (%d when 2 required)", argc); + } + + if (TYPE(argv[0]) != T_FIXNUM) { + rb_raise(rb_eArgError, "Argument position is not a fixnum"); + } + + pos = FIX2INT(argv[0]); + objects = rb_ary_new4(argc-1, argv+1); + rb_ary_replace(ary, pos, 0, objects); + + return ary; +} + VALUE rb_ary_each(ary) VALUE ary; @@ -1615,6 +1639,7 @@ rb_define_method(rb_cArray, "[]", rb_ary_aref, -1); rb_define_method(rb_cArray, "[]=", rb_ary_aset, -1); + rb_define_method(rb_cArray, "insert", rb_ary_insert, -1); rb_define_method(rb_cArray, "at", rb_ary_at, 1); rb_define_method(rb_cArray, "first", rb_ary_first, 0); rb_define_method(rb_cArray, "last", rb_ary_last, 0);