/* * call-seq: * str[fixnum] = fixnum * str[fixnum] = new_str * str[fixnum, fixnum] = new_str * str[range] = aString * str[regexp] = new_str * str[regexp, fixnum] = new_str * str[other_str] = new_str * * Element Assignment---Replaces some or all of the content of <i>str</i>. The * portion of the string affected is determined using the same criteria as * <code>String#[]</code>. If the replacement string is not the same length as * the text it is replacing, the string will be adjusted accordingly. If the * regular expression or string is used as the index doesn't match a position * in the string, <code>IndexError</code> is raised. If the regular expression * form is used, the optional second <code>Fixnum</code> allows you to specify * which portion of the match to replace (effectively using the * <code>MatchData</code> indexing rules. The forms that take a * <code>Fixnum</code> will raise an <code>IndexError</code> if the value is * out of range; the <code>Range</code> form will raise a * <code>RangeError</code>, and the <code>Regexp</code> and <code>String</code> * forms will silently ignore the assignment. */ static VALUE rb_str_aset_m(argc, argv, str) int argc; VALUE *argv; VALUE str; { if (argc == 3) { if (TYPE(argv[0]) == T_REGEXP) { rb_str_subpat_set(str, argv[0], NUM2INT(argv[1]), argv[2]); } else { rb_str_splice(str, NUM2LONG(argv[0]), NUM2LONG(argv[1]), argv[2]); } return argv[2]; } if (argc != 2) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc); } return rb_str_aset(str, argv[0], argv[1]); }