Кортеж
Кортеж - это структура, состоящая из нескольких полей необходимых типов, создаваемая налету в том месте программы, где это необходимо.
Тип кортежа - это однозначное сочетание типов всех его элементов.
В языке Перфолента для кортежей поддерживается специальный синтаксис и некоторые виды операций:
Кортеж обозначается знаком $ (доллар).
1) Создание кортежа.
- с указанием типов: $<ТипПоля1,,,,ТипПоляН>(ЗначениеПоля1,,,,ЗначениеПоляН), в этом случае возможны конвертации значений к типам полей;
- без указания типов: $(ЗначениеПоля1,,,,ЗначениеПоляН), типы полей в этом случае автоматически определяются по типам присвоенных значений;
2) Определение типа кортежа при определении формальных параметров или возвращаемого значения.
- $<ТипПоля1,,,,ТипПоляН>
Содержание
Класс System.Tuple - объектный кортеж. Устаревший
Класс System.Tuple - объектный кортеж, этот класс считается устаревшим вариантом. Его можно применять при необходимости используя обычный синтаксис работы с объектами поддерживается в цикле Для Каждого, в инициализаторе и в декомпозиции.
Кортежи удобны когда надо возвратить из функции несколько значений
к1=ПолучитьКортежTuple() ВыводСтроки "Тип Tuple: ПолучитьКортеж1() к1.Элемент1="+к1.Элемент1+" к1.Элемент2="+к1.Элемент2 //Для Каждого ЭлЦел тип Целое, ЭлСтр тип Строка Из {к1,к1} //Для Каждого ЭлЦел, ЭлСтр Из {к1,к1} //ВыводСтроки "ЭлЦел="+ЭлЦел+" ЭлСтр="+ЭлСтр //КонецЦикла
в кортежах типа System.Tuple значения не изменяемы...
//к1.Элемент1=555 //не работает...
Класс System.ValueTuple - структурный кортеж. Современный вариант
Класс System.ValueTuple - структурный кортеж. Этот класс считается современным вариантом и используется в Перфоленте, для него определен специальный синтаксис. Поддерживается в цикле Для Каждого, в инициализаторе и в декомпозиции.
к2=ПолучитьКортежValueTuple ВыводСтроки "Тип ValueTuple: ПолучитьКортеж2() к2.Элемент1="+к2.Элемент1+" к2.Элемент2="+к2.Элемент2 ПринятьКортеж(к2)
Кортежи могут применяться как элементы в массивах и обобщенных коллекциях
Перем масЦС2 тип $<Целое,Строка>[,] = Неопределено //переменная под двухмерный массив кортежей Массив масЦС[2] тип $<Целое,Строка> //массив кортежей масЦС[0]=к2 СтекЦС = Новый Стек<$<Целое,Строка>> //стек с кортежами СтекЦС.Добавить(к2) СтекЦС.Добавить(масЦС[0]) Для ЦС Из СтекЦС ВыводСтроки "ЦС.Элемент1="+ЦС.Элемент1+" ЦС.Элемент2="+ЦС.Элемент2 КонецЦикла
////???????????????? при позднем связывании не находит поле Элемент1 //Для ЦС тип Объект Из СтекЦС // //падаем... // ВыводСтроки "ЦС.Элемент1="+ЦС.Элемент1+" ЦС.Элемент2="+ЦС.Элемент2 // //а с приведением вручную работает // ВыводСтроки "ЦС.Элемент1="+ТипКТипу(ЦС,"$<Целое,Строка>").Элемент1+" ЦС.Элемент2="+ТипКТипу(ЦС,"$<Целое,Строка>").Элемент2 // //и на английском работает // ВыводСтроки "ЦС.Элемент1="+ЦС.Item1+" ЦС.Элемент2="+ЦС.Item2 //КонецЦикла
//Для Каждого ЭлЦел тип Целое, ЭлСтр тип Строка Из {к2,к2} //Для Каждого ЭлЦел, ЭлСтр Из {к2,к2} //ВыводСтроки "ЭлЦел="+ЭлЦел+" ЭлСтр="+ЭлСтр //КонецЦикла
тут правильная ошибка компиляции, количество значений в кортежах не сходится
//к2=$<Целое,Строка,ДВещ>(300,"Hello_3",3.3)
//к2 = $<Целое,Строка>(300,"Hello_3") //работает к2 = $(300,"Hello_3") //определение типов по значениям тоже работает
значения кортежа System.ValueTuple изменяемы
к2.Элемент1=400 к2.Элемент2="Hello_4" ВыводСтроки "Тип ValueTuple: к2.Элемент="+к2.Элемент1+" к2.Элемент2="+к2.Элемент2
можно обращаться к элементам кортежа и с помощью индексатора
в этой версии языка Перфолента индексы могут быть только константными выражениями
к2[0]=2+к2[0]-3+1 к2[2-1]=""+к2[1] ВыводСтроки "Тип ValueTuple: к2[0]="+к2[0]+" к2[1]="+к2[1]
ВыводСтроки "к2 = "+к2
декомпозиция значений из кортежа в переменные
Присвоить п1, п2 = к1 ВыводСтроки "Присвоено п1="+п1+" п2="+п2 Присвоить п1, п2 = к2 ВыводСтроки "Присвоено п1="+п1+" п2="+п2
декомпозиция значений из кортежа в переменные
Присвоить Имя, Отчество = $("Иван","Иванович") ВыводСтроки "Присвоено Имя="+Имя+" Отчество="+Отчество
присвоение значений из списка выражений в список переменных
Присвоить Имя2, Отчество2 = "Петр","Петрович" ВыводСтроки "Присвоено Имя2="+Имя2+" Отчество2="+Отчество2
обмен значений переменных Имя2 и Отчество2, и добавится переменная Фамилия2
Присвоить Отчество2, Имя2, Фамилия2 = Имя2, Отчество2, "Васечкин" ВыводСтроки "Присвоено обменом Имя2="+Имя2+" Отчество2="+Отчество2+" Фамилия2="+Фамилия2 //???????????? декомпозиция в цикле в проекте //Для Каждого Имя,Отчество Из {$("Иван","Иванов"),$("Петр","Петров")}
Операции сравнения двух кортежей одинакового типа
к3 = $(400,"Hello_4") //определение типов по значениям //в реальности сейчас к2=к3 ВыводСтроки "к2=к3 "+(к2=к3) ВыводСтроки "к2<>к3 "+(к2<>к3) ВыводСтроки "к2>к3 "+(к2>к3) ВыводСтроки "к2>=к3 "+(к2>=к3) ВыводСтроки "к2<к3 "+(к2<к3) ВыводСтроки "к2<=к3 "+(к2<=к3)
к3 = $(400,"Hello_5") //определение типов по значениям //в реальности сейчас к2<к3 ВыводСтроки "к2=к3 "+(к2=к3) ВыводСтроки "к2<>к3 "+(к2<>к3) ВыводСтроки "к2>к3 "+(к2>к3) ВыводСтроки "к2>=к3 "+(к2>=к3) ВыводСтроки "к2<к3 "+(к2<к3) ВыводСтроки "к2<=к3 "+(к2<=к3)
аналогичный тест сравнения массивов на равенство
ма1={2,4} ма2={2,4} ВыводСтроки "ма1=ма2 "+(ма1=ма2) ВыводСтроки "ма1<>ма2 "+(ма1<>ма2)
Создание массива из кортежа, фактически декомпозиция кортежа в массив
//??????? падаем на Win7 в следующей строке кортмас = {ИЗ $(3,4,5.1,"вас")} //будет тип Объект[] ВыводСтроки "кортмас = "+кортмас.Представление //заполнение массива из кортежа //??????? падаем на Win7 в следующей строке кортмас{ИЗ $(6,7)} ВыводСтроки "кортмас = "+кортмас.Представление
из кортежа типа Tuple
кортмас{ИЗ к1} ВыводСтроки "кортмас = "+кортмас.Представление
Консоль.Пауза
КонецПроцедуры
//--------------------------- Функция ПолучитьКортежTuple() тип Tuple<Целое,Строка> //Возврат Tuple.Create<Целое,Строка>(100,"Hello") //работает Возврат Новый Tuple<Целое,Строка>(100,"Hello") КонецФункции //--------------------------- //Функция ПолучитьКортежValueTuple() тип ValueTuple<Целое,Строка> //работает //Функция ПолучитьКортежValueTuple() тип $<Кво тип Целое, Имя тип Строка> //??????? это в проекте пока Функция ПолучитьКортежValueTuple() тип $<Целое,Строка> //работает Возврат $(200,"Hello_2") //работает //и более длинные варианты того же самого: Возврат $<Целое,Строка>(200,"Hello_2") //работает Возврат Новый $<Целое,Строка>(200,"Hello_2") //работает Возврат Новый ValueTuple<Целое,Строка>(200,"Hello_2") //работает Возврат ValueTuple.Create<Целое,Строка>(200,"Hello_2") //работает КонецФункции
//--------------------------- Процедура ПринятьКортеж(Корт тип $<Целое,Строка>) ВыводСтроки "Тип ValueTuple: ПринятьКортеж(Корт) Корт.Элемент1="+Корт.Элемент1+" Корт.Элемент2="+Корт.Элемент2 КонецПроцедуры КонецПрограммы