返回过滤范围
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
构造中。
我正在查看过滤范围,有点困惑。在 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
构造中。