Как сделать диапазон С, но обратный отсчет
Я хочу, чтобы цикл, который считает от 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
, но гораздо более читабельно.