Константы типа записей

Язык:
Русский
English

 Константы типа записей


Объявление константы типа записи содержит идентификатор и значение каждого поля записи.

Поля должны быть определены в том же порядке, в котором они были объявлены при определении типа записи.

 ■ Если запись содержит поля файлового типа, то константы такого типа
   записи не могут быть объявлены.
 ■ Если запись содержит вариант, то определены могут быть только поля
   указанного варианта.
 ■ Если вариант содержит поле метки, то её значение должно быть задано.

Примеры

 type
   Point = record
     X, Y : Real;
   end;
   Vector = array[0 .. 1] of Point;
   Month = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
   Date = record
     D : range 1 .. 31;
     M : Month;
     Y : 1900 .. 2020;
   end;

 const
   Origin : Point = (X : 0.0; Y : 0.0);
   Line : Vector = ((X : -3.1; Y : 1.5), (X : 5.8; Y : 3.0));
   SomeDay : Date = (D : 2; M : Dec; Y : 1960);

Ада

 type Point is record
    X, Y : Float;
 end record;

 type Vector is array (0 .. 1) of Point;
 type Month is (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);

 type Date is record
    D : Natural range 1 .. 31;
    M : Month;
    Y : Natural range 1900 .. 2020;
 end record;

 Origin : Point := (X | Y => 0.0);
 Line : Vector := ((Y => 1.5, X => -3.1), (Y => 3.0, others => 5.8));
 Some_Date : Date := (2, Dec, 1960);

Агрегаты (так они называются в языке Ада) можно использовать не только при инициализации констант, но и вообще в любых выражениях. В ЛЮБЫХ!

 function "-" (Left, Right : Point) return Point is
 begin
    return (X => Right.X - Left.X, Y => Right.Y - Left.Y);
 end "-";

 Line_Diff : Point := Line (1) - Line (0);

Иногда агрегат может быть воспринят компилятором двояко, и в этом случае нужно явно указывать тип с помощью конструкции тип'(значение). Например:

 Point'(2.0, 3.0)

будет всегда воспринято однозначно. В приведённом выше примере тип указывать не потребовалось, потому что сопоставление типов в языке Ада производится не только снизу вверх, но и сверху вниз. Функция "-" может вернуть только значение выражения типа Point, поэтому указание типа было необязательно.

Одним из следствием двустороннего сопоставления типов является возможность перегружать функции не только по типу аргументов, но и по типу результата.

Внутри агрегатов указание названия полей необязательно, но настоятельно рекомендуется для повышения читабельности. Если не указывать названия полей, то компилятор будет ожидать их в том порядке, в каком они были перечислены в объявлении записи. Внутри агрегата могут быть заданы и безымянные, и именованные поля, но именованные должны обязательно следовать за безымянными:

 Date'(2, Dec, Y => 1960)

Поля внутри агрегата можно перечислять в любом порядке. Задать значение сразу нескольким именованным полям можно, перечислив их названия через | (знак трубы):

 Point'(X | Y => 0.0)

Также можно в конце списка использовать зарезервированное слово others, чтобы задать значение оставшимся полям:

 Point'(Y => 3.0, others => 5.8)

Лексема <> означает значение по умолчанию.

См. также

Лекция №7.1: Записи. Бинарные файлы

Код для вставки: :: :: :: ::
Поделиться: // //