d - 返回过滤后的范围

标签 d

我正在查看过滤范围,并感到有点困惑。在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 运行时管理的动态数组。它由两部分组成:一个值部分,其中包含其长度和一个指针,该指针指向堆上的动态部分(存储整数的位置)。长度和指针本身是按值传递的,这意味着附加或删除不会影响原始元素,但编辑元素例如vals[1] = 1 会的。要通过引用传递所有内容,您可以使用

filterNums(ref int[] vals)

无论哪种方式,垃圾收集器都会在需要时保留它,在本例中,它存储在 filter 构造中。

关于d - 返回过滤后的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71351480/

相关文章:

struct - 使用 CTFE 生成结构体别名集

d - 拆分/拆分的编译问题

templates - D:显示给定类型是否具有可比性的模板约束

检查字符串时出现 dlang 不兼容类型错误

makefile - 如何使用 D 的生成文件?

floating-point - 为什么 D 中是 0.1 + 0.2 == 0.3?

compiler-errors - D 编程不完全编译器

templates - 如何确保模板类型是 D 中的标量?

templates - 为什么这些模板函数的行为不像虚函数?

curl - D etc.c.curl 示例