Простейшие новые возможности
В данной статье рассматриваются простейшие возможности PascalABC.NET, которые часто используются в программах:
- операторы
+=,-=,*=,/=; - инициализация переменной при описании;
- внутриблочные описания переменных;
- автоопределение типа переменной при описании;
- описание переменных в заголовке цикла
for.
Отметим, что их использование удобно и естественно для PascalABC.NET, хотя такой код может быть несовместим с другими диалектами Object Pascal.
Операторы +=, -=, *=, /=
Эти операторы пришли из языка C. Запись
a += 2;
воспринимается проще, чем
a := a + 2;
и тем более проще, чем
Inc(a,2);
Кроме того, конструкции вроде
a += 2;
можно использовать буквально с первых занятий по программированию.
Небольшая тонкость: если i имеет тип integer, то
i /= 2;
вызовет ошибку компиляции, поскольку выражение трактуется как
i := i / 2;
а результат деления имеет вещественный тип.
Для множеств определены операторы +=, -=, *=, а для строк — оператор +=:
begin
var s := 'PascalABC';
var d := [200..300];
s += '.NET';
d -= [100..298];
Println(s);
Println(d);
end.
Операторы += и -= используются также при работе с делегатами .NET.
Инициализация переменной при описании
Переменную можно сразу инициализировать при описании:
var i: integer := 1;
В PascalABC.NET таким образом можно инициализировать локальные переменные, а также поля записей и классов:
procedure P;
begin
var i: integer := 1;
end;
type
Frac = record
num: integer := 0;
denom: integer := 1;
end;
MyClass = class
s: string := 'NET';
end;
Инициализировать переменные можно не только константами, но и произвольными выражениями, в частности вызовами конструкторов:
var L: List<integer> := new List<integer>;
Внутриблочные описания переменных
Если переменная используется только в одном фрагменте алгоритма, нет необходимости выносить ее описание далеко от места использования.
Например, пусть дано x и требуется вычислить x⁷, используя как можно меньше умножений.
Можно написать:
begin
var x := ReadReal;
var a := x*x;
var b := a*x;
var y := a*a*b;
Println(y);
end.
Здесь вспомогательные переменные a и b описаны непосредственно там, где они понадобились.
Такой стиль уменьшает область видимости переменных и делает код более локальным и читаемым.
Автоопределение типа переменной
В описании
var i: integer := 1;
имя типа часто избыточно: выражение 1 уже имеет тип integer.
Поэтому можно написать:
var i := 1;
Тип переменной будет определен автоматически.
Особенно удобно это при работе с обобщенными типами:
var d := new Dictionary<string,integer>;
вместо более длинной записи:
var d: Dictionary<string,integer> := new Dictionary<string,integer>;
Автоопределение типа не означает динамическую типизацию: тип переменной определяется компилятором и после этого остается фиксированным.
Описание переменной в заголовке цикла for
Переменную цикла удобно описывать непосредственно в заголовке:
begin
var str := '';
for var c := 'a' to 'z' do
str += c;
Println(str);
end.
Область видимости переменной c ограничена самим циклом.
То же самое особенно удобно для обычных целочисленных циклов:
begin
var p := 1;
for var i := 1 to 10 do
p *= i;
Println(p);
end.
Переменная i существует только внутри цикла и не засоряет окружающую область видимости.
Вывод
Все рассмотренные возможности направлены на то, чтобы сделать программы короче и понятнее:
- составные присваивания избавляют от повторения имени переменной;
- инициализация при описании связывает создание переменной с ее начальным значением;
- внутриблочные переменные уменьшают область видимости;
- автоопределение типа устраняет избыточное указание типов;
- объявление переменной непосредственно в
forделает цикл самодостаточным.
Сегодня эти конструкции являются привычной частью современного стиля программирования на PascalABC.NET.