Отличия шага Установить переменную и SmartQuery
Last updated
Last updated
Исторически сложилось так, что в SmartBot есть 2 разных способа для вычисления значений выражений с переменными: шаг "Установить переменные" и SmartQuery (SQ, шаг Выполнить SmartQuery).
Изначально был только шаг "Установить переменные". Его основная задача — сохранять текст в переменную. Так, например, с его помощью можно сохранить ответ пользователя из переменной %сообщение% в какую-то локальную переменную.
Также можно использовать этот шаг для сохранения меток пользователей, например:
Ещё этот шаг позволяет производить несложные арифметические вычисления с переменными. Например, если вам нужно считать, сколько раз бот выполнил определённый шаг для каждого пользователя, это можно сделать так:
Подробное описание возможностей этого шага можно посмотреть тут: Операции с переменными.
Алгоритм работы этого шага можно описать следующим образом:
Подставляем значения переменных (в виде текста) в правую часть выражения
Результирующую строку пытаемся выполнить как арифметическое выражение
Если выражение удалось вычислить, то подставляем вместо него,полученный результат
Иначе оставляем всё как было - текстом, полученным в п.1
Такой подход хорош простотой для новичков: пользователю не нужно задумываться на сложными конструкциями языков программирования, не нужно думать над типами операндов. Тут всё — текст. Но он подвержен ошибкам.
Рассмотрим на примере. Пусть у нас есть 2 переменные: %a% и %b%. Допустим, их значения вводит пользователь.
%a% | %b% | Выражение | Результат |
10 | 10 | %a% + %b% | 20 |
10 | 10ш | %a% + %b% | 10 + 10ш |
Видно, что во втором случае выражение не удалось вычислить (из-за "ш"), и оно осталось не вычисленным, хоть переменные и были подставлены. Другим негативным примером может быть кейс, когда пользователь в переменную занесёт что-то, что может быть проинтерпретировано как арифметическое выражение. Возможно вы не хотите его вычислять, просто хотите сохранить как есть. Но сделать этого не можете, потому что SmartBot всегда пытается вычислить выражение в правой части шага Установить переменную.
%сообщение% | Выражение | Результат |
20 * 2 | %сообщение% | 40 |
Кроме того, так как этот шаг всегда подставляет переменные в виде текста, вы не можете работать с массивами и словарями в этом шаге без SQ.
SmartQuery — это встроенный в SmartBot скриптовый язык программирования со строгой динамической типизацией. Во многом он похож на Python.
При использовании SQ не возникает никаких неоднозначностей при интерпретации выражений. Так, например, строки в SQ всегда заключены в кавычки, и значения переменных не подставляются как текст, вместо этого используется их реальное значение, будь то массив, словарь, число или строка.
Приведём несколько примеров:
Значением переменной %var1% будет строка 2 * 2, %var2% — число 4, %var3% — строка из переменной %сообщение%. При этом даже если в %сообщение% будет записано арифм. выражение оно не будет вычислено, потому что строка есть строка, строка — это не выражение.
С помощью SQ можно сделать всё, что можно сделать с помощью "Установить переменную" и гораздо больше, но синтаксис сложнее.
Подробнее про SQ можно почитать тут: Введение. Документация: Справочник функций.
Выражения на SQ можно использовать везде, не только в шаге "Выполнить SmartQuery" и в сложных условиях, но и в тексте сообщений, рассылок и т.п. Для этого выражение нужно обернуть в двойные фигурные скобки. Это говорит смартботу, что вместо выражения нужно подставить его текстовое представление результата его вычисления в текст сообщения. Таким образом всё, что находится внутри {{ }} — это выражение на языке SQ, и оно будет вычислено, а всё что снаружи — это просто текст. Обратите внимание, что в шаге "Выполнить SmartQuery" и в сложных условиях фигурные скобки ставить не нужно: там всё поле ввода — это одно выражение на SQ, а не текст.
В шаге "Установить переменную" можно использовать такие переменные как %ранд(a, b)% и %дата+N%. В целом, не очень корректно их называть переменными, но так сложилось исторически. В SQ они недоступны, потому что противоречат синтаксису этого языка программирования. Вместо них в SQ есть функция rand(a, b). Кроме того, она также позволяет получить случайное значение из массива. Альтернативы для второй переменной в SQ на данный момент нет.
В шаге Установить переменную тоже можно использовать SQ -- в фигурных скобках, также как и везде, где можно использовать обычные переменные. Но скорее всего, удобней будет всё же воспользоваться шагом "Выполнить SmartQuery".
Так как в "Установить переменную" подстановка переменных идёт перед вычислением выражения, то для того, чтобы склеить 2 строки вместе вам просто нужно написать их подряд. Тут нет никакого спец. синтаксиса. Смартбот не сможет вычислить это выражение как арифметическое, и просто ограничится подстановкой значений переменных в текст.
В SQ того же результата будет добиться гораздо сложнее
Работать с словарями и массивами можно только в SQ.
Функции из раздела Операции с переменными доступны только в шаге Установить переменную. Функции SQ описаны тут: Справочник функций.