Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su

13.9. Не работает многострочное условие. Как исправить?

В: Не работает многострочный код. Как исправить?

Пишу такой код:

if mark_var=1: 'Первый текст.'
    'Второй текст.'
    'Третий текст.'
end

Но даже если `mark_var` равно нулю, второй и третий текст всё равно выводятся.

О:

Необходимо различать однострочную и многострочную формы записи конструкции условия.

Вот так выглядит однострочная форма:

IF [#выражение]: [команды 1]

Как видите, за ключевым словом `IF` следует выражение `[#выражение]`, и если это выражение верно, тогда выполняется набор команд `[команды 1]`, который записан после двоеточия в той же строке, что и `IF`. При этом команды перечисляются через амперсанд (`&`).

Код из примера в однострочной форме должен будет выглядеть так:

if mark_var=1: 'Первый текст.' & 'Второй текст.' & 'Третий текст.'

Однострочную форму записи не требуется закрывать ключевым словом `END`, так как окончанием этой формы считается конец строки с `IF`.

А вот так выглядит многострочная форма записи конструкции условия:

IF [#выражение]:
    [команды 1]
END

Здесь после двоеточия в той же строке, где находится и ключевое слово `IF`, ничего не пишется. Именно так плеер понимает, что имеет дело с многострочной формой записи. И в этом случае, если выражение `[#выражение]` верно, плеер ищет соответствующие верному условию команды (`[команды 1]`) в следующей строке после двоеточия.

Многострочная форма записи всегда закрывается ключевым словом `END`. Только так плеер может понять, что последующие команды уже не относятся к конструкции условия.

Код из примера в многострочной форме записи должен выглядеть так:

if mark_var=1:
    'Первый текст.'
    'Второй текст.'
    'Третий текст.'
end

Или так:

if mark_var=1:
    'Первый текст.' & 'Второй текст.' & 'Третий текст.'
end

Оба варианта являются многострочной формой записи конструкции условия.

Теперь нетрудно догадаться, почему даже когда `mark_var` равно нулю в исходном примере второй и ттретий тексты всё равно выводились.

Плеер встречает конструкцию:

if mark_var=1: 'Первый текст.'

и, поскольку за двоеточием в той же строке, где находится `IF`, идёт команда `'Первый текст.'`, плеер понимает, что это однострочная форма записи, а значит окончанием конструкции условия можно считать конец строки. Таким образом команды, расположенные в нижеследующих строках, для плеера попросту не относятся к конструкции условия, и он выполняет их в любом случае. `END` при этом игнорируется.