gpt4 book ai didi

ruby - Array.reject!,它是如何工作的?

转载 作者:数据小太阳 更新时间:2023-10-29 07:09:52 25 4
gpt4 key购买 nike

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

我不太习惯使用 ruby​​(自从 1-2 周前我的假期工作开始后才开始使用它),但我的一个习惯是在迭代时避免接触列表(或大多数其他使用索引的 ADT)在它们之上(删除某些内容),与我使用的语言无关。

经过一些搜索,我发现了一些可以提供帮助的 Array 函数。现在,我正在使用 Array.reject! 并且脚本按照我希望的方式运行,但老实说我无法弄清楚为什么 Array.reject! {|行| line =~ regex } 跳过数组中的对象没有问题。这些来源,ruby-docs & some random website ,确认在迭代时立即应用了更改,这让我想知道它是如何不搞砸的......被删除的行之间没有空格/单词,只有 \n 将下一个带到它自己的行(但这只是字符串末尾的一部分)。

有人对此有很好的解释吗?

最佳答案

Array#reject! 使用 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++;
}
}

有趣的是 ifor 语句中没有递增。如果给 reject! 的 block 求值为 true,则当前元素被删除,ary[i] 自动指向下一个元素。只有当它的计算结果为 false 时,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]

关于ruby - Array.reject!,它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11468001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com