Кортеж

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

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

Тип кортежа - это однозначное сочетание типов всех его элементов.

В языке Перфолента для кортежей поддерживается специальный синтаксис и некоторые виды операций:

Кортеж обозначается знаком $ (доллар).

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
   КонецПроцедуры	

КонецПрограммы	

См. также

Ссылки