Инициализаторы объектов

Материал из ТХАБ.РФ
Перейти к: навигация, поиск

Как быстро заполнить объект исходными данными? Сделать это проще всего с помощью специальной синтаксической конструкции - инициализатора.

Инициализаторы являются мощной возможностью языка программирования Перфолента.Net, которая уменьшает количество кода, делает его более наглядным и понятным.

Синтаксически, инициализатор представляет собой набор значений или выражений, перечисленных через запятую и заключенных в фигурные скобки.

Инициализаторы позволяют:

  • создать одномерный или многомерный массив и заполнить его значениями
  • заполнить значениями существующий одномерный или многомерный массив
  • вызвать заполняющий метод объекта с необходимыми параметрами столько раз, сколько данных необходимо добавить в объект
  • заполнить видимые свойства объекта
  • вызвать несколько раз метод объекта, не являющегося коллекцией, с необходимыми параметрами

Рассмотрим все эти случаи более подробно.

Создание одномерного массива с помощью инициализатора

Для создания одномерного массива, просто перечислим его значения через запятую в фигурных скобках.

ЧислаОтОдногоДоПяти = {1, 2, 3, 4, 5} ДниНедели = {"", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"}

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

//с помощью индексатора вытащим третий элемент созданного на лету массива СредаКратко = {"", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"}[3] //передадим созданный на лету массив в параметры метода ОбработатьЧисла( {1, 2, 3, 4, 5} ) //обработаем каждый элемент созданного на лету массива Для Каждого ДеньНедели Из {"Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"} Цикл

               ОбработатьДеньНедели(ДеньНедели)

КонецЦикла

Зададимся вопросом, какого типа будет массив, созданный инициализатором?

Применяются такие правила:

  • Если в списке все значения одного типа, то этот же тип получит созданный массив
  • Если в списке только числовые значения разных типов, то массив получит тип самого точного из имеющихся типов. Все значения будут приведены к типу массива
  • Если в списке находятся значения разных типов, то массив получит тип Объект[]
//Этот массив получит тип Число[], т.к. все элементы имеют этот тип
Мас1 = {1ч, 2ч, 3ч, 4ч}
//Этот массив получит тип ДВещ[], как самый точный из типов всех чисел
Мас2 = {1ц8, 2ч, 3в, 4д}
//Этот массив получит тип Объект[], т.к. все значения разных типов
Мас3 = {"Пн", '20240101', 1ц8, 2ч, 3в, 4д}

Подробнее про одномерные массивы можно прочитать в статье «Массивы. Создание массивов, заполнение данными, обращения к элементам и другие операции с массивами.»

Создание многомерного массива с помощью инициализатора

Для создания многомерного массива применяются вложенные инициализаторы для каждого измерения массива. Все остальные правила создания многомерного массива с помощью инициализатора такие же, как и для одномерного.

ДвухмерныйМассивВещЧисел = {

   {0.0, 0.1, 0.2},
   {1.0, 1.1, 1.2},
   {2.0, 2.1, 2.2}
   };

ТрёхмерныйМассивВещЧисел = {

   { {0.00, 0.01}, {0.10, 0.11} },
   { {1.00, 1.01}, {1.10, 1.11} }
   };

Заполнение существующего одномерного массива с помощью инициализатора

Для заполнения существующего массива инициализатор пишется сразу после имени массива или после выражения, возвращающего массив.

//создадим и заполним массив из 4-х элементов 
Мас1 = Новый Число[3]
Мас1{1ч, 2ч, 3ч, 4ч}
//заполним первые 4 элемента массива, который вернет функция ПолучитьМассив
Мас2 = ПолучитьМассив(){1ч, 2ч, 3ч, 4ч}

Обратите внимание, при заполнении массива количество значений в инициализаторе не должно превышать количество элементов в массиве, иначе произойдет исключение во время выполнения программы.

При заполнении массива типы значений инициализатора приводятся к типу массива.

//все значения будут приведены к типу строка
Мас3 = Новый Строка[5]{"Пн", '20240101', 1ц8, 2ч, 3в, 4д}

Заполнение существующего многомерного массива с помощью инициализатора

Для заполнения многомерного массива применяются вложенные инициализаторы для каждого измерения массива. Все остальные правила заполнения многомерного массива с помощью инициализатора такие же, как и для одномерного.

ДвухмерныйМассивВещЧисел = Новый Вещ[2, 2]
//заполняем
ДвухмерныйМассивВещЧисел{
   {0.0, 0.1, 0.2},
   {1.0, 1.1, 1.2},
   {2.0, 2.1, 2.2}
   };
ТрёхмерныйМассивВещЧисел = Новый Вещ[1, 1, 1]
//заполняем
ТрёхмерныйМассивВещЧисел{
   { {0.00, 0.01}, {0.10, 0.11} },
   { {1.00, 1.01}, {1.10, 1.11} }
   };

Вызов заполняющего метода объекта с помощью инициализатора

В языке программирования Перфолента.Net поддерживается вызов следующих заполняющих методов: Добавить(...), Вставить(...), Add(...), Append(...), Set(...), Push(...), Enqueue(...), где три точки означают один или несколько параметров. Типы параметров и их порядок в инициализаторе должны соответствовать типам и порядку параметров метода.

Если у объекта есть один из этих методов, то заполнять объект можно с помощью инициализатора.

Типы значений инициализатора приводятся к типам параметров заполняющего метода.

//Допустим, что коллекция типа МояКоллекция имеет метод Добавить с одним параметром типа Строка.
//Создадим коллекцию и добавим в неё 3 элемента
Кол1 = Новый МояКоллекция{"Эл.0","Эл.1","Эл.2"}

На заметку: Если вы добавите в свой класс один из указанных методов, то сможете наполнять его данными с помощью инициализатора.

Многократный вызов произвольного метода объекта с помощью инициализатора

Иногда необходимо вызвать какой-либо метод объекта несколько раз с разным набором параметров. Для минимизации исходного кода в этом случае можно применить инициализатор.

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

Типы значений инициализатора приводятся к типам параметров заполняющего метода.

//отправим 3 сигнала, вызвав 3 раза метод с одним параметром
Линия.ПослатьСигнал{"Сигнал1", "Сигнал2", "Сигнал3"}
//добавим 2 товара, вызвав 2 раза метод с тремя параметрами
Магазин.ДобавитьТовар{ {"Арт.1", "Утюг", 3}, {"Арт.2", "Стул", 5}}

Обращение к членам объекта с помощью инициализатора

Очень часто, необходимо заполнить сразу несколько свойств и\или вызвать несколько методов одного объекта. Что бы постоянно не повторять имя объекта, можно воспользоваться инициализатором.

//создадим и заполним объект типа Кот
МойКот = Новый Кот{ .Цвет="Рыжий", .Вес=5, .Рост=28, .РассчитатьРацион("Месяц")}

Обратите внимание, что мы не только заполнили свойства, но и вызвали метод.

В этом примере мы заполняли новый объект, но объект мог быть создан ранее.

Инициализатор ИЗ

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

В остальном, инициализатор ИЗ применяется аналогично обычному инициализатору.

Приведем примеры.

//создание массива из массива
СтрМас = {ИЗ {"один","два","три"}}
//заполнение массива из массива
Мас456 = {"четыре","пять","шесть"}
СтрМас{ИЗ мас456[:1]} //подкинем два элемента из трех
//создание массива символов из строки
СимМас = {ИЗ "набор_символов_в_строке"}
//заполнение массива символами из строки
СимМас{ИЗ "меньше_символов"}
//создание массива из коллекции
КолМас = {ИЗ Новый МояКоллекция{"Эл.0",1,'2018'}}
//заполнение массива из коллекции
КолМас{ИЗ Новый МояКоллекция{"Эл.0",1,'2018'}}
//создание массива из кортежа
КортМас = {ИЗ $(3,4,5.1,"вас")} //будет тип Объект[]
//заполнение массива из кортежа
Кортмас{ИЗ $(6,7)}    
//заполнение массива из существующего кортежа
Кортеж = $(600,700)
КортМас{ИЗ Кортеж}
//обходим кортеж с помощью инициализатора
Стр = ""
Для Каждого Обж Из {Из Кортеж}
    Стр += Обж.ВСтроку+";"
КонецЦикла;
ВыводСтроки "Содержимое кортежа = " + Стр

Вывод: Инициализаторы позволяют быстро, удобно и наглядно написать заполнение объекта данными, будь-то массив, коллекция или произвольный объект.

Ссылки