diff --git array.c array.c index 86cf09e..abe9555 100644 --- array.c +++ array.c @@ -3620,15 +3620,21 @@ rb_ary_plus(VALUE x, VALUE y) /* * call-seq: - * ary.concat(other_ary) -> ary + * ary.concat(other_ary1, other_ary2,...) -> ary * - * Appends the elements of +other_ary+ to +self+. + * Appends the elements of +other_ary+s to +self+. * * [ "a", "b" ].concat( ["c", "d"] ) #=> [ "a", "b", "c", "d" ] + * [ "a" ].concat( ["b"], ["c", "d"] ) #=> [ "a", "b", "c", "d" ] + * [ "a" ].concat #=> [ "a" ] + * * a = [ 1, 2, 3 ] * a.concat( [ 4, 5 ] ) * a #=> [ 1, 2, 3, 4, 5 ] * + * a = [ 1, 2 ] + * a.concat(a, a) #=> [1, 2, 1, 2, 1, 2] + * * See also Array#+. */ @@ -3643,6 +3649,15 @@ rb_ary_concat(VALUE x, VALUE y) return x; } +static VALUE +rb_ary_concat_m(int argc, VALUE *argv, VALUE ary) +{ + for (int i = 0; i < argc; i++) + rb_ary_concat(ary, argv[i]); + + return ary; +} + /* * call-seq: @@ -5810,7 +5825,7 @@ Init_Array(void) rb_define_method(rb_cArray, "fetch", rb_ary_fetch, -1); rb_define_method(rb_cArray, "first", rb_ary_first, -1); rb_define_method(rb_cArray, "last", rb_ary_last, -1); - rb_define_method(rb_cArray, "concat", rb_ary_concat, 1); + rb_define_method(rb_cArray, "concat", rb_ary_concat_m, -1); rb_define_method(rb_cArray, "<<", rb_ary_push, 1); rb_define_method(rb_cArray, "push", rb_ary_push_m, -1); rb_define_method(rb_cArray, "pop", rb_ary_pop_m, -1); diff --git string.c string.c index 2782d28..4646670 100644 --- string.c +++ string.c @@ -2766,6 +2766,15 @@ rb_str_concat(VALUE str1, VALUE str2) return str1; } +static VALUE +rb_str_concat_m(int argc, VALUE *argv, VALUE ary) +{ + for (int i = 0; i < argc; i++) + rb_str_concat(ary, argv[i]); + + return ary; +} + /* * call-seq: * str.prepend(other_str) -> str @@ -2786,6 +2795,15 @@ rb_str_prepend(VALUE str, VALUE str2) return str; } +static VALUE +rb_str_prepend_m(int argc, VALUE *argv, VALUE ary) +{ + for (int i = argc-1; i >= 0; i--) + rb_str_prepend(ary, argv[i]); + + return ary; +} + st_index_t rb_str_hash(VALUE str) { @@ -9681,9 +9699,9 @@ Init_String(void) rb_define_method(rb_cString, "codepoints", rb_str_codepoints, 0); rb_define_method(rb_cString, "reverse", rb_str_reverse, 0); rb_define_method(rb_cString, "reverse!", rb_str_reverse_bang, 0); - rb_define_method(rb_cString, "concat", rb_str_concat, 1); + rb_define_method(rb_cString, "concat", rb_str_concat_m, -1); rb_define_method(rb_cString, "<<", rb_str_concat, 1); - rb_define_method(rb_cString, "prepend", rb_str_prepend, 1); + rb_define_method(rb_cString, "prepend", rb_str_prepend_m, -1); rb_define_method(rb_cString, "crypt", rb_str_crypt, 1); rb_define_method(rb_cString, "intern", rb_str_intern, 0); /* in symbol.c */ rb_define_method(rb_cString, "to_sym", rb_str_intern, 0); /* in symbol.c */