返回过滤范围

Returning a filtered range

我正在查看过滤范围,有点困惑。在 D 中,我可以编写以下代码:

import std.stdio;
import std.range;
import std.algorithm;

auto filterNums(int[] vals)
{
    int limit = 3;
    return filter!(n => n >limit)(vals);
}

int main()
{
    int[] nums = [1,2,3,4,5];

    auto flt = filterNums(nums);

    foreach(n;flt)
    {
        writeln(n);
    }

    return 0;
}

给出预期输出:

4
5

但这似乎不是非常安全的代码。如果过滤器是惰性求值的,一旦局部变量超出范围,它怎么知道 limit 是 3?我的代码是否幸运,没有其他东西在内存中覆盖 limit ?传递的变量 nums 也是引用或复制的值:如果是值,过滤器是否制作自己的副本?

或者我没有以正确的方式使用 filter

int 是一个值类型,所以过滤器 lambda 接收它的一个副本。如果存在任何范围问题,编译器会警告您。

int[] nums是由D的runtime管理的动态数组。它由两部分组成:一个值部分,它包含它的长度和一个指针,它指向堆上的动态部分(存储整数的地方)。长度和指针本身按值传递,这意味着添加或删除不会影响原始元素,但编辑元素,例如vals[1] = 1 会。要通过引用传递所有内容,您可以使用

filterNums(ref int[] vals).

无论哪种方式,只要需要,垃圾收集器都会保留它,在这种情况下,它存储在 filter 构造中。