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

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

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

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

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

Числа ​

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

Исходный типПредставление числа
Нулевая ссылка (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' — строка, которая не может быть преобразована в число, поэтому первый операнд тоже конвертируется в строку и они сравниваются как строки (они равны).

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