Списки инициализации объектов и контейнеров
Список инициализации — концепция, суть которой состоит в том, что переменные контейнерного или объектного типов могут быть созданы передачей списка вычисляемых значений для полей объекта или для элементов контейнера.
Отличают так же константные списки инициализации,в которых не используются любые вычисляемые выражения, там могут быть использованы только константы контейнерного типа или константы объектного типа.
Список полей переменной объектного типа заключается в квадратные скобки. Имя поля и соответствующее вычисляемое выражение разделяются знаком равенства. Порядок полей в списке роли не играет.
В списке инициализации экземпляра объектного типа в качестве значения поля нельзя использовать другое поле этого же экземпляра объектного типа. Это же касается и переменных контейнерного типа.
Синтаксис
[<имя объектного типа>] [ <имя поля> = <выражение>, [<следующее поле>, ...]]
Пример
ТИП День[ ДАТА: дата; СТРОКА: день_недели; ] ВЫЧИСЛИТЬ ПЕРЕМ День: сегодня = [дата = ДАТА_ТЕК, день_недели = ДЕНЬП(ДЕНЬ_НЕДЕЛИ(ДАТА_ТЕК)) ] // ошибка, использование поля "дата" при инициализации другого поля ПЕРЕМ День: сегодня = [дата = ДАТА_ТЕК, день_недели = ДЕНЬП(ДЕНЬ_НЕДЕЛИ(дата)) ] ОТЛАДКА(сегодня) КОНЕЦ
В списке инициализации можно указывать функции. В таком случае, вызов функции происходит в том порядке, в котором они написаны в списке инициализации, вне зависимости от порядка объявления полей в объектном типе.
Пример
ТИП Альфа [ СТРОКА: имя; ДАТА: дата; ] ФУНКЦИЯ СТРОКА: Фу1 ОТЛАДКА("Фу1") РЕЗУЛЬТАТ = "Альфа" КОНЕЦ_ФУНКЦИИ ФУНКЦИЯ ДАТА: Фу2 ОТЛАДКА("Фу2") РЕЗУЛЬТАТ = ДАТА_ТЕК КОНЕЦ_ФУНКЦИИ ВЫЧИСЛИТЬ ПЕРЕМ Альфа: а1 = [ имя = Фу1, дата = Фу2 ] ПЕРЕМ Альфа: а2 = [ дата = Фу2, имя = Фу1 ] ОТЛАДКА(а1) ОТЛАДКА(а2) КОНЕЦ
Список элементов переменной контейнерного типа заключается в круглые скобки. Элементы в списке разделяются запятой. В ассоциативных или многомерных контейнерах элемент состоит из вычисляемых индексных выражений, перечисленных через запятую, и значения элемента, отделенного от значений индексов двоеточием.
Синтаксис
(<индексное выражение1>[, <индексное выражение2>, ...]: <значение элемента> [, <следующий элемент>, ... ])
Пример
ВЫЧИСЛИТЬ ПЕРЕМ СТРОКА: список[ЧИСЛО, СТРОКА] = ( (ГОД(ДАТА_ТЕК) - ГОД(28.11.1989)), "И": "Иванов", (ГОД(ДАТА_ТЕК) - ГОД(08.06.1969)), "П": "Петров", (ГОД(ДАТА_ТЕК) - ГОД(15.10.1959)), "С": "Сидоров" ) ЦИКЛ ИНДЕКС (фамилия = список[возраст, буква]) СООБЩЕНИЕ(фамилия + " : " + СТР(возраст) + "лет") КОНЕЦ_ЦИКЛА КОНЕЦ
В списке инициализации переменной контейнерного типа в качестве индексной переменной используется вычисляемое значение возраста для каждого значения элемента контейнера.
При использовании последовательного одномерного контейнера можно указывать только значение элемента , то есть значение индекса для каждого значения элемента необязательно. Такой способ задания последовательного контейнера удобнее стандартного, так как при вставке нового элемента не приходится изменять значения индексов для последующих элементов.
Синтаксис
(<значение элемента1>[, <следующий элемент>, ... ])
Пример
ВЫЧИСЛИТЬ ПЕРЕМ ЧИСЛО: список[] = ( ГОД(28.11.1989), ГОД(08.06.1969), ГОД(15.10.1959), ) ЦИКЛ ИНДЕКС (год_рождения = список[номер]) СООБЩЕНИЕ( СТР(номер) +" : " + СТР(год_рождения)) КОНЕЦ_ЦИКЛА КОНЕЦ