如何用 .. 制作一个范围,但倒计时
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
相同的优化,但更具可读性。
我想要一个从 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
相同的优化,但更具可读性。