Конвертация типов
Шаблонный движок будет пытаться автоматически конвертировать значения определённых типов данных, если они не соответствуют требуемому типу.
Правила конвертации
Для некоторых типов данных происходит автоматическое конвертирование значений, которое следует следующим правилам:
Числа
Там, где ожидается число, значения других типов данных могут быть сконвертированы следующим образом:
| Исходный тип | Представление числа |
|---|---|
Нулевая ссылка (null) | 0 |
| Неопределенный | 0 |
| Логический | 1 если true, 0 если false |
| Строка | Будет попытка распознать число в этой строке |
| DateTime | Преобразуется во временную метку (Timestamp) |
Логический
Там, где ожидается логическое значение, значения других типов данных могут быть сконвертированы следующим образом:
| Исходный тип | Логическое представление |
|---|---|
Нулевая ссылка (null) | false |
| Неопределенный | false |
| Строка | false если строка пустая, иначе true |
| Список или Карта | false если пусты, иначе true |
| Число | false если 0, иначе true |
Строка
Там, где ожидается строка, значение любого типа данных будет просто сконвертировано в строку так, как это происходит при его выводе.
Дата и время
Там, где ожидается DateTime, значения других типов данных могут быть сконвертированы следующим образом:
| Исходный тип | Представление даты |
|---|---|
| Строка |
|
| Число | Преобразует в дату, используя число как временная метку (Unix timestamp) |
Где это работает?
Автоматическая конвертация типов данных работает:
- В операторах и выражениях;
- В конструкциях
if; - В аргументах функций;
- В параметрах методов, с некоторыми исключениями и особенностями.
Конвертация в параметрах методов
Операции сравнения
В бинарных операциях сравнения (>, >=, <, <=, in, ==, !=), шаблонный движок следует следующему алгоритму:
- Если оба операнда могут быть конвертированы в число, то конвертируются и сравниваются как числа;
- Если хотя бы один из операндов не может быть конвертирован в число, то оба операнда конвертируются в строки и сравниваются как строки.
Этот алгоритм универсален, но в некоторых случаях следует учитывать порядок вычисления операций. Например:
{{ 'true' == 1 == true }}
{{ true == 1 == 'true' }}
Казалось бы, оба выражения должны распечатать true, однако первый из них распечатает false.
В первом выражении:
'true' == 1вычисляется какfalse, потому что строка'true'не может быть конвертирована в число и оба выражения сравниваются как строки'true'и'1', что в результате даётfalse;- Вторая операция сравнения теперь выглядит как
false == true, что в результате даётfalseкак результат вычисления всего выражения целиком.
Во втором выражении:
true == 1вычисляется какtrue, потому что логическийtrueможет быть преобразован в число 1, и оба операнда сравниваются как числа (они равны);- Вторая операция сравнения теперь выглядит как
true == 'true', что в результате даётtrue, но только лишь потому, что второй операнд'true'— строка, которая не может быть преобразована в число, поэтому первый операнд тоже конвертируется в строку и они сравниваются как строки (они равны).