如何用 .. 制作一个范围,但倒计时

How to make a Range with .., but counting down

我想要一个从 5 计数到 1 的循环。我知道我可以使用 .. 运算符轻松地做相反的事情:

for 1..5 { .print }
12345

但是当使用 .. 运算符并反转两侧时,它似乎没有生成 for 可以使用的有效范围:

for 5..1 { .print }
Nil

我知道我可以在 Range 对象上使用 reverse 方法:

for (1..5).reverse { .print }
54321

但是,我希望 .. 运算符能够以某种方式在 1 次调用中生成数字列表。我的问题是,如何使用 .. 运算符创建一个倒计时的范围?

只需使用 5...1(注意 3 ...):

for 5...1 { .print }
54321

Range.reverse的迭代器和forwards的迭代器基本一样,只是从尾到头迭代。除了对 .reverse 的额外初始调用外,执行上应该没有区别。

除了 for 1..5 { } 实际上是静态优化的,根本不在内部使用 Range。我想这是进一步静态优化的机会。

编辑:https://github.com/rakudo/rakudo/commit/2dd02751da 确保 for (1..5).reverse 的优化方式与 for 1..5 相同。这使它快了大约 6 倍。

编辑:从 https://github.com/rakudo/rakudo/commit/dfd6450d74 开始,对范围进行倒计时的最佳方法是 for 5...1:它使用与 (1..5).reverse 相同的优化,但更具可读性。