我正在查看过滤范围,并感到有点困惑。在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/