Ruby 是gsub!复制字符串';什么是缓冲区?
我想知道在以下两种情况下,字符串对象的内部字符串缓冲区在#gsub调用期间是如何更新的:Ruby 是gsub!复制字符串';什么是缓冲区?,ruby,Ruby,我想知道在以下两种情况下,字符串对象的内部字符串缓冲区在#gsub调用期间是如何更新的: 未进行替换。例如“hello”.gsub!('r','a') 搜索字符串和替换字符串的字节长度完全相同。例如,“hello”.gsub!('e','a') 在这两种情况下,#gsub会创建一个新的字符串缓冲区,将原始缓冲区复制到新缓冲区,然后丢弃原始缓冲区吗?或者替换是否会到位?MRI有一种方法来处理这两种情况,gsub和gsub,取决于最后一个参数: static VALUE str_gsub(int a
“hello”.gsub!('r','a')
“hello”.gsub!('e','a')
gsub
和gsub代码>,取决于最后一个参数:
static VALUE str_gsub(int argc, VALUE *argv, VALUE str, int bang)
如果未找到匹配项,则该方法仅返回nil
(gsub!
)或字符串的副本(gsub
):
然后执行替换,然后替换字符串(gsub!
),或者返回新实例(gsub
):
为什么这很重要?Ruby有多种实现,答案可能取决于您感兴趣的实现(和版本)。您可以检查最新的MRI实现。MRI将创建新的缓冲区并替换字符串。如果找不到匹配项,字符串将保持不变。@Stefan:如果你确定这一点,那么你应该给出答案。很好的解释..我喜欢..)
beg = rb_reg_search(pat, str, 0, 0);
if (beg < 0) {
if (bang) return Qnil; /* no match, no substitution */
return rb_str_dup(str);
}
dest = rb_str_buf_new(blen);
if (bang) {
rb_str_shared_replace(str, dest);
}
else {
RBASIC(dest)->klass = rb_obj_class(str);
OBJ_INFECT(dest, str);
str = dest;
}
if (tainted) OBJ_TAINT(str);
return str;