教堂领域有两种方法
domain.low, domain.high
和
domain.first, domain.last
这些返回不同结果的情况有哪些(在什么情况下
domain.first != domain.low
和domain.last != domain.high
是什么情况? 最佳答案
首先,请注意,这些查询不仅在域上受支持,而且在范围上也受支持(一种更简单的类型,它表示许多域及其域查询所基于的整数序列)。因此,为了简单起见,我的答案将首先集中在范围上,然后再返回密集的矩形域(使用每个维度的范围定义)。
作为背景,范围内的first
和last
旨在指定在该范围内迭代时将获得的索引。相反,low
和high
指定定义范围的最小和最大索引。
1..10
,first
和low
将相同,评估为1
,而last
和high
都将评估为10
1..10 by -1
这样的负步幅。对于此范围,low
和high
仍分别为1
和10
,但是first
将为10
和last
将为1
,因为该范围代表整数10、9、8,...,1。1..10 by 2
范围,low
和high
仍将分别为1
和10
,first
仍将为1
但last
将为9
,因为此范围仅表示1到10之间的奇数。下面的程序演示了这些情况以及
1..10 by -2
,我将留给读者作为练习(您也可以try it online (TIO)):proc printBounds(r) {
writeln("For range ", r, ":");
writeln(" first = ", r.first);
writeln(" last = ", r.last);
writeln(" low = ", r.low);
writeln(" high = ", r.high);
writeln();
}
printBounds(1..10);
printBounds(1..10 by -1);
printBounds(1..10 by 2);
printBounds(1..10 by -2);
使用每个维度的范围定义密集的矩形域。在此类域上,诸如
low
,high
,first
和last
之类的查询将返回一个元组值,每个维度一个,对应于各个范围内查询的结果。例如,这是根据上述范围(TIO)定义的4D域:const D = {1..10, 1..10 by -1, 1..10 by 2, 1..10 by -2};
writeln("low = ", D.low);
writeln("high = ", D.high);
writeln("first = ", D.first);
writeln("last = ", D.last);
关于教堂领域: differences between `low/high` and `first/last` methods,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51332007/