ruby - gsub!复制字符串的缓冲区?

标签 ruby

在这两种情况下,我想确切地知道在 #gsub 调用期间字符串对象的内部字符串缓冲区是如何更新的:

  1. 没有进行替换。例如 "hello".gsub!('r', 'a')
  2. 搜索字符串和替换字符串的字节长度完全相同。例如,"hello".gsub!('e', 'a')

在这两种情况下,#gsub 是否会创建一个新的字符串缓冲区,将原始缓冲区复制到新缓冲区,然后丢弃原始缓冲区?还是就地替换?

最佳答案

MRI 有单一方法 str_gsub处理 gsubgsub!,这取决于最后一个参数:

static VALUE str_gsub(int argc, VALUE *argv, VALUE str, int bang)

如果未找到匹配项,该方法将返回 nil (gsub!) 或字符串的副本 (gsub):

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);

然后执行替换,然后替换字符串 (gsub!) 或返回新实例 (gsub):

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;

关于ruby - gsub!复制字符串的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19340178/

相关文章:

mysql - Ruby 将 Mysql 时间戳转换为 Mysql 日期时间

ruby - Ruby 中的有限矩阵

ruby - 双小于负 "<<-"符号在 ruby 中有什么意义吗?

Ruby ||= 运算符线程安全

ruby - 使用 Ruby 注入(inject)计算嵌套总和

windows - 如何使用 Linux 实例化/运行 Ruby 程序(使用 Watir)?

ruby-on-rails - Carrierwave如何获取文件扩展名

javascript - select2 不保存编辑输入

ruby-on-rails - Rails 中有条件地更改 link_to 位置的简洁方法

mysql - 在 Openshift 上使用 Sequel 连接到 mysql