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