Ruby 数组。拒绝!,它到底是如何工作的?

Ruby 数组。拒绝!,它到底是如何工作的?,ruby,arrays,object,iteration,Ruby,Arrays,Object,Iteration,我今天制作了一个非常小的ruby脚本,它利用正则表达式跟踪文件中具有特定名称的某些内容,并在添加替换内容之前删除这些内容。(否则在迭代过程中会出错) 我不太习惯ruby(只是在我的假期工作开始后才开始使用它,那是1-2周前),但我的习惯之一是在迭代列表时避免触摸列表(或大多数其他ADT使用索引)(删除某些内容),不管我使用哪种语言 经过一番搜索,我找到了一些可能有用的Array函数。现在,我正在使用Array.reject和脚本的工作方式就像我希望它工作一样,但我真的不明白为什么Array.re

我今天制作了一个非常小的ruby脚本,它利用正则表达式跟踪文件中具有特定名称的某些内容,并在添加替换内容之前删除这些内容。(否则在迭代过程中会出错)

我不太习惯ruby(只是在我的假期工作开始后才开始使用它,那是1-2周前),但我的习惯之一是在迭代列表时避免触摸列表(或大多数其他ADT使用索引)(删除某些内容),不管我使用哪种语言

经过一番搜索,我找到了一些可能有用的
Array
函数。现在,我正在使用
Array.reject和脚本的工作方式就像我希望它工作一样,但我真的不明白为什么
Array.reject!{| line | line=~regex}
在跳过数组中的对象时没有问题。这些来源,以及,确认在迭代时立即应用了更改,这使我想知道它是如何不出错的。。。要删除的行之间没有空格/单词,只有
\n
将下一行带到它自己的行(但这只是字符串末尾的一部分)


有人对此有很好的解释吗

以下是
ary\u reject\u bang
的源代码,它是
reject的C实现的核心

static VALUE
ary_reject_bang(VALUE ary)
{
    long i;
    VALUE result = Qnil;

    rb_ary_modify_check(ary);
    for (i = 0; i < RARRAY_LEN(ary); ) {
        VALUE v = RARRAY_PTR(ary)[i];
        if (RTEST(rb_yield(v))) {
            rb_ary_delete_at(ary, i);
            result = ary;
        }
        else {
            i++;
        }
    }
    return result;
}
Array#拒绝
使用
for
循环迭代数组元素。以下是C代码:

for (i = 0; i < RARRAY_LEN(ary); ) {
  VALUE v = RARRAY_PTR(ary)[i];
  if (RTEST(rb_yield(v))) {
    rb_ary_delete_at(ary, i);
    result = ary;
  } 
  else {
    i++;
  }
}

@Stephan,好吧,我没想到会出现这样的情况……但它完全有道理,而且确实是一个非常有用的实现,可以安全地删除对象。非常感谢你的解释!如果我有15个rep:p-solve,我会投赞成票。我想我回答了错误的评论,你可能没有得到通知,因为你在他的帖子前给出了答案,只是说这是为了通知你我已经阅读/从你的评论中学到了什么;p、 看看这篇优秀的文章:
for (i = 0; i < RARRAY_LEN(ary); ) {
  VALUE v = RARRAY_PTR(ary)[i];
  if (RTEST(rb_yield(v))) {
    rb_ary_delete_at(ary, i);
    result = ary;
  } 
  else {
    i++;
  }
}
[a b c d].reject! {|x| x == b}

 0 <------- i # doesn't match => i++
[a b c d]

   1 <----- i # matches => delete ary[i]
[a b c d]

   1 <----- i # doesn't match => i++
[a c d]

     2 <--- i # doesn't match => finished
[a c d]