Как сделать диапазон С, но обратный отсчет

Я хочу, чтобы цикл, который считает от 5 до 1. Я знаю, что могу сделать противоположное легко с .. оператор:

for 1..5 { .print }
12345

но при использовании .. оператор и обращая стороны, он, похоже, не генерирует допустимый диапазон, который for может работать с:

for 5..1 { .print }
Nil

Я знаю, что могу использовать reverse метод объекта Range:

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

однако, я ожидал бы, что .. оператор имеет определенный способ генерации списка чисел в 1 звонок. Мой вопрос в том, как создать диапазон, который отсчитывается с помощью .. оператор?

1 ответов


просто использовать 5...1 (Примечание 3 ... ):

for 5...1 { .print }
54321

итератор, что Range.reverse в основном тот же итератор, что и для форвардов, но итерация от конца до начала. Помимо дополнительного начального вызова .reverse, там должно быть никакой разницы в исполнении.

за исключением того, что for 1..5 { } фактически статически оптимизирован, чтобы не использовать Range внутри все. Я думаю, что это возможность для дальнейшего статического оптимизация.

EDIT:https://github.com/rakudo/rakudo/commit/2dd02751da гарантирует, что for (1..5).reverse оптимизирован так же, как for 1..5. Это делает его примерно в 6 раз быстрее.

EDIT: начиная с https://github.com/rakudo/rakudo/commit/dfd6450d74, лучший способ отсчета диапазона -for 5...1: это использует ту же оптимизацию, что и (1..5).reverse, но гораздо более читабельно.