Функция синтаксического анализатора switch , закодированная как " #switch ", выбирает первую соответствующую ветвь в списке вариантов, действуя как оператор case .
Каждая ветвь может быть значением , выражением ( вычислением ) или вызовом шаблона , [1] оцененным и сравненным для соответствия значению переключателя. Хотя многие структуры #switch используются для ветвления среди простого набора значений, ветви также могут включать булевы выражения , чтобы действовать как набор предварительных условий, которые должны быть проверены, пока одно из них не станет истинным, действуя как структура if-elseif-elseif-elseif-else .
#switch может содержать более 1000 ветвей, но для лучшей скорости его следует разделить так, чтобы в каждой из нескольких или вложенных частей было менее 100 ветвей. Верхние ветви выполняются быстрее, а нижние ветви должны ждать сравнений всех более высоких ветвей. Поскольку это функция парсера , #switch можно использовать внутри любой страницы, даже в тексте статьи, но в большинстве случаев #switch обычно используется внутри шаблона для ветвления в зависимости от значения параметра, переданного шаблону.
Функция #switch может иметь однострочную форму:
{{ #switch : {{{ x }}} | 1 = один | 2 = два | 3 | 4 | 5 = диапазон 3–5 | другой }}
Этот однострочный #switch будет считывать значение {{{x}}} . Для значения 1 он вернет "one". Для значения 2 он вернет "two". Для значений 3, 4 или 5 он вернет "range 3–5". Для любого другого значения или нулевого значения он вернет "other".
Однако во многих случаях функция #switch представляет собой многострочную форму, в которой каждая ветвь находится на отдельной строке, как показано ниже:
{{#переключатель: {{{x}}} | 1 = один | 2 = два | #по умолчанию = другой | 3|4|5 = любой из 3–5 | {{#expr: 2*3}} = шесть | {{#expr: 2*3+1}} = {{lc:SEVEN}} <!--строчные-->}}
Это иллюстрирует альтернативный метод указания регистра по умолчанию, который может быть первым, последним или где-то между ними.
Если значение по умолчанию не указано и ни один регистр не соответствует указанному значению, возвращается нулевое значение.
Для каждой ветви #switch любая сторона знака равенства "=" может быть простым значением, выражением или вызовом шаблона.
Функция #switch может быть структурирована как набор предварительных условий, которые проверяются до тех пор, пока одно из них не станет истинным (равным «1»). Например, для предварительной проверки чисел, чтобы избежать деления на ноль, в формуле: x/x2 + y/y2
{{ #switch : 1 | {{ #ifeq :{{{ x2 | none }}}| none | 1 | 0 }} = Параметр x2 не имеет данных. | {{ #ifeq :{{{ y2 | none }}}| none | 1 | 0 }} = Параметр y2 не имеет данных. | {{ #expr : {{{ x2 }}} = 0 }} = Параметр x2 равен 0 – делить нельзя. | {{ #expr : {{{ y2 }}} = 0 }} = Параметр y2 равен 0 – делить нельзя. | 1 = {{ #expr : {{{ x }}} / {{{ x2 }}} + {{{ y }}} / {{{ y2 }}}}} } }
При тестировании x2 и y2, если любой из них равен нулю (отсутствует), то #switch завершается предупреждающим сообщением, а не вычисляет средневзвешенное значение двух сумм x, y, с x2 и y2. Каждая ветвь действует как предварительное условие, поэтому вся структура #switch работает как эквивалент if-elseif-elseif-elseif-else , даже если структура #if-function не может иметь предложение "elseif". Обратите внимание на 2 типа сравниваемых данных:
#switch
образом #ifeq:
: {{#ifeq:{{{x2|none}}}|none|1|0}}
#switch
используя #expr:
следующие операции: или{{#expr: {{{y2}}} = 0}}
{{#expr: {{{x}}} < 41500}},
Другой пример: проверка числа «n» для определения количества десятичных цифр:
{{ #switch : 1 | {{ #expr : floor( {{{ n }}} *100) <> {{{ n }}} *100 }} = 3 | {{ #expr : floor( {{{ n }}} *10) <> {{{ n }}} *10 }} = 2 | {{ #expr : floor( {{{ n }}} ) <> {{{ n }}} }} = 1 | {{ #expr : {{{ n }}} mod 1000 = 0 }} = −3 | {{ #expr : {{{ n }}} mod 100 = 0 }} = −2 | {{ #expr : {{{ n }}} mod 10 = 0 }} = −1 | 1 = 0 }}
Это еще один пример использования «#switch: 1» для создания набора предварительных условий, которые проверяются последовательно, пока одно из них не станет истинным (равным «1»).
Шаблоны, использующие такие запутанные операторы switch, которые могут вызывать значительные проблемы с производительностью, следует перевести на Lua , если это сделает их проще или значительно быстрее. Приведенное ниже обсуждение редко бывает уместным, но сохраняется для справки.
#switch может содержать более 1000–2000 ветвей, но должен быть разделен так, чтобы иметь менее 100 ветвей, в нескольких или вложенных частях. В некоторых случаях может быть возможно разделить на несколько структур #switch, например, когда во многих случаях используется одна и та же первая буква. Затем, используя, можно извлечь первую букву для использования в более высоком #switch, который разветвляется по наиболее часто встречающейся букве, за которой следуют все остальные в нижней части или ветке "#default". Другим распространенным разделением может быть разделение числовых значений на частые диапазоны, за которыми следуют все остальные.{{padleft:|1|{{{value}}} }}
{{{value}}}
Верхние ветви #switch выполняются быстрее, а нижние ветви должны ждать сравнений всех верхних ветвей. Следовательно, верхняя ветвь должна быть наиболее используемым случаем, если только предварительный отбор данных не выполняется в ранних ветвях.
{{Template:Foobar}}
и {{Foobar}}
.