Руководство разработчика

Уточнение типов

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

Синтаксис для уточнения типов выражений:

<имя типа> ( <выражение> )

Пример:

ВЫЧИСЛИТЬ
  // объявляем контейнерную переменную со смешанным типом элементов
  ПЕРЕМ *: ип [СТРОКА] = ( "фамилия": "Иванов", "дата": 12.01.2000 )

  // хотим получить дату на день раньше ип["дата"]
  дата1 = ип["дата"] - 1 // ошибка времени выполнения 
  // Тип первого операнда неизвестен, а тип второго операнда 
  // числовой. Неопределенность типа переменной дата1. В этом случае
  // компилятор берет по умолчанию для дата1 тип второго аргумента.
  // Во время выполнения: несовместимые типы дата и число.

  // теперь уточним тип
  дата2 = ДАТА ( ип["дата"] ) - 1 // правильно
  // Компилятор знает, что при вычитании числа из 
  // даты получится дата. В результата переменная дата2 имеет тип дата.

  // случай недопустимого уточнения
  дата3 = ДАТА ( "19.05.2016" ) // ошибка
  // В скобках стоит выражение строкового типа, несовместимого 
  // с типом ДАТА.
КОНЕЦ

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

Синтаксис для уточнения типов в операторах вызова методов объектов:

<имя типа> ( <объект> ). <имя метода> [ ( <параметры> ) ]

Пример:

// некий тип А, содержащий метод Ф
ТИП А 
[ 
  ФУНКЦИЯ Ф(СТРОКА: текст)
    СООБЩЕНИЕ(текст)
  КОНЕЦ_ФУНКЦИИ
]

// общая индексная переменная смешанного типа, начально содержащая объект типа А
ПЕРЕМ *: оп[ЧИСЛО] = ( 1: А[] );

ВЫЧИСЛИТЬ
  // вызываем метод Ф объекта оп[1], для этого явно указываем, что оп[1] имеет тип А
  А( оп[1] ).Ф( "Здравствуй, мир!" )
КОНЕЦ

Обработка уточнений типов производится на этапе компиляции и не влияет на скорость работы программы. В случае, когда тип выражения, определенный компилятором, не совместим с типом уточнения, возникает ошибка. Имеет смысл всегда использовать уточнение типов при работе с неопределенными (смешанными) типами результатов и параметров функций, элементов и индексов индексных переменных и т.п.

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

Синтаксис для уточнения типа переменной контейнерного типа:

<имя контейнерного типа> (( <элементы контейнера> )

Пример:

ТИП Конт = ИНДЕКС СТРОКА: @[ЦЕЛОЕ(), СТРОКА];

ВЫЧИСЛИТЬ
 
  ПЕРЕМ х = Конт((1, "А": "Альфа", 2, "Б": "Бета", 3, "Г": "Гамма"))
  ОТЛАДКА(х)
  
КОНЕЦ

См. также: