Перейти к содержимому

Конвертация типов

Шаблонный движок будет пытаться автоматически конвертировать значения определённых типов данных, если они не соответствуют требуемому типу.

Правила конвертации

Для некоторых типов данных происходит автоматическое конвертирование значений, которое следует следующим правилам:

Числа

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

Исходный типПредставление числа
Нулевая ссылка (null)0
Неопределенный0
Логический1 если true, 0 если false
СтрокаБудет попытка распознать число в этой строке
DateTimeПреобразуется во временную метку (Timestamp)

Логический

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

Исходный типЛогическое представление
Нулевая ссылка (null)false
Неопределенныйfalse
Строкаfalse если строка пустая, иначе true
Список или Картаfalse если пусты, иначе true
Числоfalse если 0, иначе true

Строка

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

Дата и время

Там, где ожидается DateTime, значения других типов данных могут быть сконвертированы следующим образом:

Исходный типПредставление даты
Строка
  • Преобразование из формата ISO 8601: yyyy-MM-dd'T'HH:mm:ss.SSSZ
  • Если строка является now, будет создан экземпляр текущей даты.
ЧислоПреобразует в дату, используя число как временная метку (Unix timestamp)

Где это работает?

Автоматическая конвертация типов данных работает:

Конвертация в параметрах методов

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

Операции сравнения

В бинарных операциях сравнения (>, >=, <, <=, in, ==, !=), шаблонный движок следует следующему алгоритму:

  1. Если оба операнда могут быть конвертированы в число, то конвертируются и сравниваются как числа;
  2. Если хотя бы один из операндов не может быть конвертирован в число, то оба операнда конвертируются в строки и сравниваются как строки.

Этот алгоритм универсален, но в некоторых случаях следует учитывать порядок вычисления операций. Например:

JuniperBot Template
{{ 'true' == 1 == true }}
{{ true == 1 == 'true' }}

Казалось бы, оба выражения должны распечатать true, однако первый из них распечатает false.

В первом выражении:

  1. 'true' == 1 вычисляется как false, потому что строка 'true' не может быть конвертирована в число и оба выражения сравниваются как строки 'true' и '1', что в результате даёт false;
  2. Вторая операция сравнения теперь выглядит как false == true, что в результате даёт false как результат вычисления всего выражения целиком.

Во втором выражении:

  1. true == 1 вычисляется как true, потому что логический true может быть преобразован в число 1, и оба операнда сравниваются как числа (они равны);
  2. Вторая операция сравнения теперь выглядит как true == 'true', что в результате даёт true, но только лишь потому, что второй операнд 'true'строка, которая не может быть преобразована в число, поэтому первый операнд тоже конвертируется в строку и они сравниваются как строки (они равны).

Все права зафырканы.