我希望有一个从5到1的循环.我知道我可以轻松地与..运算符相反:
for 1..5 { .print }
12345
Run Code Online (Sandbox Code Playgroud)
但是当使用..运算符并反转边时,它似乎不会生成for可以使用的有效范围:
for 5..1 { .print }
Nil
Run Code Online (Sandbox Code Playgroud)
我知道我可以reverse在Range对象上使用该方法:
for (1..5).reverse { .print }
54321
Run Code Online (Sandbox Code Playgroud)
但是,我希望..运营商能够以一定的方式在1次呼叫中生成数字列表.我的问题是,如何创建一个使用..运算符倒计时的Range ?
Eli*_*sen 11
只需使用5...1(注意3 ...):
for 5...1 { .print }
54321
Run Code Online (Sandbox Code Playgroud)
迭代Range.reverse器与转发器基本上是相同的迭代器,但是从末尾到开头迭代.除了额外的初始调用之外.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,但更具可读性.