Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 是gsub!复制字符串';什么是缓冲区?_Ruby - Fatal编程技术网

Ruby 是gsub!复制字符串';什么是缓冲区?

Ruby 是gsub!复制字符串';什么是缓冲区?,ruby,Ruby,我想知道在以下两种情况下,字符串对象的内部字符串缓冲区在#gsub调用期间是如何更新的: 未进行替换。例如“hello”.gsub!('r','a') 搜索字符串和替换字符串的字节长度完全相同。例如,“hello”.gsub!('e','a') 在这两种情况下,#gsub会创建一个新的字符串缓冲区,将原始缓冲区复制到新缓冲区,然后丢弃原始缓冲区吗?或者替换是否会到位?MRI有一种方法来处理这两种情况,gsub和gsub,取决于最后一个参数: static VALUE str_gsub(int a

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

  • 未进行替换。例如
    “hello”.gsub!('r','a')
  • 搜索字符串和替换字符串的字节长度完全相同。例如,
    “hello”.gsub!('e','a')
  • 在这两种情况下,#gsub会创建一个新的字符串缓冲区,将原始缓冲区复制到新缓冲区,然后丢弃原始缓冲区吗?或者替换是否会到位?

    MRI有一种方法来处理这两种情况,
    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;