教堂领域有两种方法

domain.low, domain.high


domain.first, domain.last

这些返回不同结果的情况有哪些(在什么情况下domain.first != domain.lowdomain.last != domain.high是什么情况?

最佳答案

首先,请注意,这些查询不仅在域上受支持,而且在范围上也受支持(一种更简单的类型,它表示许多域及其域查询所基于的整数序列)。因此,为了简单起见,我的答案将首先集中在范围上,然后再返回密集的矩形域(使用每个维度的范围定义)。

作为背景,范围内的firstlast旨在指定在该范围内迭代时将获得的索引。相反,lowhigh指定定义范围的最小和最大索引。

  • 对于一个简单范围,例如1..10firstlow将相同,评估为1,而lasthigh都将评估为10
  • 在Chapel中以相反的顺序迭代范围的方法是使用像1..10 by -1这样的负步幅。对于此范围,lowhigh仍分别为110,但是first将为10last将为1,因为该范围代表整数10、9、8,...,1。
  • 礼拜堂还支持非单位跨步,它们也可能导致差异。例如,对于1..10 by 2范围,lowhigh仍将分别为110first仍将为1last将为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);
    

    使用每个维度的范围定义密集的矩形域。在此类域上,诸如lowhighfirstlast之类的查询将返回一个元组值,每个维度一个,对应于各个范围内查询的结果。例如,这是根据上述范围(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/

    10-12 21:34