← Все статьи

Простейшие новые возможности

В данной статье рассматриваются простейшие возможности 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.