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