教堂领域有两组方法
domain.low, domain.high
和
domain.first, domain.last
在哪些情况下它们返回不同的结果(即domain.first != domain.low
和domain.last != domain.high
何时?
答案 0 :(得分:6)
首先,请注意,这些查询不仅在域上受支持,而且在范围上也受支持(一种更简单的类型,它代表许多域及其域查询所基于的整数序列)。出于这个原因,为了简单起见,我的答案最初将重点放在范围上,然后再返回到密集的矩形域(使用每个维度的范围定义)。
作为背景,范围内的first
和last
用于指定在该范围内迭代时将获得的索引。相反,low
和high
指定定义范围的最小和最大索引。
对于一个简单范围,例如1..10
,first
和low
将相同,其值为1
,而last
和{ {1}}都将评估为high
在Chapel中以相反顺序迭代范围的方式是使用10
之类的负向步幅。对于此范围,1..10 by -1
和low
仍分别为high
和1
,但是10
将分别为first
和10
将是last
,因为该范围代表整数10、9、8,...,1。
礼拜堂也支持非单位跨步,它们也可能导致差异。例如,对于范围1
,1..10 by 2
和low
仍分别为high
和1
,而10
仍为{{1 }},但first
将是1
,因为此范围仅表示1到10之间的奇数。
以下程序与last
一起演示了这些情况,我将留给读者练习(您也可以try it online (TIO)):
9
使用每个维度的范围定义密集的矩形域。在此类域上,诸如1..10 by -2
,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
之类的查询将返回一个元组值,每个维一个,对应于相应范围内查询的结果。举例来说,以下是根据上述范围(TIO)定义的4D域:
first