Вся правда о новых диапазонах a..b
В PascalABC.NET с версии 3.6.0 появился новый диапазонный тип. Константы этого типа записываются в виде a..b, что позволяет записывать многие конструкции проще и понятнее.
Применение в условиях
Основное применение нового диапазона - в условиях вида
if x in 1..10 then
что переводится компилятором в код
(x >= 1) and (x <= 10)
Интересным здесь является то, что границы диапазона могут быть вещественными числами:
if x in 2.5..4.5 then
Другое применение новых диапазонов - в функциях, по сути требующих диапазон:
var a := Arr(1..10);
сгенерирует массив, заполненный значениями от 1 до 10, а
var c := Random('a'..'z');
Применение в цикле foreach
Следующим важным применением диапазонов является использование их в цикле foreach:
foreach var x in 1..10 do Print(x);
Здесь разумеется можно использовать диапазоны только по целым и по символам.
Диапазоны как последовательности
В ряде ситуаций диапазоны трактуются как последовательности. Так, код
(1..10).Print
1 2 3 4 5 6 7 8 9 10
(1..3).Cartesian('a'..'d').Println;
получает последовательность пар вида
(1,a) (1,b) (1,c) (1,d) (2,a) (2,b) (2,c) (2,d) (3,a) (3,b) (3,c) (3,d)
Функциональный подход как замена цикла for
Диапазон может эффективно заменить цикл for в простейших задачах. Например, цикл
for var i:=1 to 9 do if i.IsOdd then Print(i*i);
естественным образом заменяется на цепочку методов
(1..9).Where(i -> i.IsOdd).Select(x->x*x).Print;
Методы диапазонов
У диапазонов есть методы, позволяющие реверсировать их как последовательности и формировать последовательности с шагом:
(1..9).Reverse.Println; (1..9).Step(2).Println;
9 8 7 6 5 4 3 2 1 1 3 5 7 9
Заключение
Новые диапазоны PascalABC.NET позволяют писать компактный, ясный, гибкий и эффективный код.