Преобразование типа
Оператор преобразования типа создает свойство, которое преобразует объект одного встроенного класса к объекту другого встроенного класса. Результат принадлежит целевому встроенному классу. Если преобразование типа невозможно, значением свойства будет NULL. Объект пользовательского класса преобразуется к числовому или строковому классу — результатом является его внутренний идентификатор, целое число либо его текстовая запись, — а к логическому классу — в TRUE. Преобразования к пользовательскому классу нет: объект по идентификатору находят группировкой (см. корректность операции), а значение, суженное до пользовательского класса, даёт классификация.
Поддерживаемые преобразования
Какие преобразования имеют смысл, зависит от семейств встроенных классов, к которым принадлежат исходный и целевой классы:
- В пределах семейства чисел значение сохраняется настолько, насколько это допускает целевой класс; если значение не помещается в целевой класс, результатом является
NULL. - Между числами и строками значение преобразуется между числовой и текстовой формами; если исходную строку нельзя прочитать как число целевого класса, результатом является
NULL. - Строки также преобразуются в классы
JSON,JSONTEXT,XMLиHTMLи обратно.
Строковые и файловые типы
Строковые типы можно преобразовывать в файловые human-readable типы (CSVFILE, XMLFILE, JSONFILE, HTMLFILE и т.д.), и наоборот - файловые human-readable типы можно преобразовывать в строковые типы. Файл конкретного типа также можно преобразовать в файл динамического типа (FILE, NAMEDFILE) и обратно с сохранением содержимого файла; файл динамического типа дополнительно несёт расширение, а NAMEDFILE — ещё и имя.
Файлы динамического типа (FILE, NAMEDFILE) преобразуются к строкам и обратно напрямую: содержимое файла читается как текст в кодировке UTF-8 (если оно не является корректным текстом UTF-8, результат — NULL), а строка записывается как содержимое файла с расширением dat (значение класса HTML — с расширением html). Чтобы получить другое расширение, преобразуйте строку сначала к файлу конкретного типа — к примеру, к CSVFILE, а уже потом к FILE: у результирующего файла будет расширение csv
Неявные преобразования
Помимо явного оператора преобразования, платформа в ряде случаев преобразует значение к другому классу неявно, без написанного разработчиком преобразования:
- Когда объединяются значения разных, но совместимых классов — при сложении или вычитании (см. арифметические операторы), в операторах выбора или в операторах экстремума — каждое значение преобразуется к их общему предку, который становится классом результата; в частности, так расширяются числовые классы (
INTEGER, объединённый сNUMERIC, становится этимNUMERIC). - При объединении строк операнд, не являющийся строкой, преобразуется к строке.
- Когда значение записывается в свойство другого, но совместимого класса, оно преобразуется к этому классу.
- Файл конкретного типа преобразуется к файлу динамического типа (
FILE,NAMEDFILE) неявно — например, при импорте данных без указания формата или при взаимодействии с внешней системой; результирующее расширение определяется так же, как при явном преобразовании.
Язык
Для реализации преобразования используется оператор преобразования типа.
Примеры
itemCount = DATA INTEGER (Store);
itemCountToString(s) = BPSTRING[10](itemCount(s));
barcode = DATA STRING[15] (Item);
longBarcode(Item i) = LONG(barcode(i));