(в том числе анонимно криптовалютой) -- адм. toriningen
Шаблон:Scope
Пока не используйте, оно не все работает так, как хотелось бы.
Этот шаблон предназначен для эмуляции локальных областей видимости.
Содержание
Зачем это может быть нужно?[править]
Если вы пишете шаблон, у которого есть переменная X, и ваш шаблон использует другой шаблон, у которого тоже есть переменная X, you're gonna have a bad time, потому что ваша переменная будет перезаписана и в ней будет чушь.
Решение №1 — использовать префиксы к переменным (trng-wtf-prkprk--my-variable). Это громоздко и плохо читается, в префиксе легко опечататься.
Решение №2 — оборачивать свои шаблоны в {{scope}}.
Как это работает?[править]
- При входе в scope, значения всех переменных запоминаются и запихиваются в один большой общий массив.
- При выходе из scope, из большого общего массива извлекаются последние значения, которые были туда впихнуты, и восстанавливаются.
Как пользоваться?[править]
Оберните весь шаблон в scope. Первым аргументом перечислите все переменные и массивы, которые бы вы хотели сделать локальными. Вторым аргументом передайте исходный код остального шаблона.
{{scope|var1, var2, some_array|= ... }}
Небольшая демонстрация[править]
foo = 10
bar = a,b,c
buzz = 1000
quux = A,B,C
foo = 10
bar = a,b,c
buzz = 1000
quux = A,B,C
foo = override!
bar = pwned,trollz
buzz = all your vars are belong to us
quux = bro,u mad
foo = override!
bar = pwned,trollz
buzz = all your vars are belong to us
quux = bro,u mad
foo = TEMMIES!
bar = MUCH WANT,TEMMIE PROUD
buzz = LOL
quux = TEMMIE COOL
foo = override!
bar = pwned,trollz
buzz = LOL
quux = TEMMIE COOL
foo = 10
bar = a,b,c
buzz = 1000
quux = A,B,C
{{#vardefine:foo|10}} {{#arraydefine:bar|a,b,c|,}} {{#vardefine:buzz|1000}} {{#arraydefine:quux|A,B,C|,}} {{scope/doc/dump-vars | 1 | Начальные значения переменных }} {{scope|foo,bar,buzz,quux|= {{scope/doc/dump-vars | 2 | Значения внутри scope }} {{#vardefine:foo|override!}} {{#arraydefine:bar|pwned,trollz|,}} {{#vardefine:buzz|all your vars are belong to us}} {{#arraydefine:quux|bro,u mad|,}} {{scope/doc/dump-vars | 2 | Переопределяем значения }} {{scope|foo,bar|= {{scope/doc/dump-vars | 3 | Значения внутри scope #2 (локальные только foo и bar) }} {{#vardefine:foo|TEMMIES!}} {{#arraydefine:bar|MUCH WANT,TEMMIE PROUD|,}} {{#vardefine:buzz|LOL}} {{#arraydefine:quux|TEMMIE COOL|,}} {{scope/doc/dump-vars | 3 | Переопределяем значения }} }} {{scope/doc/dump-vars | 2 | Значения на выходе из scope #2 }} }} {{scope/doc/dump-vars | 1 | Значения на выходе из scope #1 }}
Подводные камни?[править]
Немного. Если вызываемый шаблон не обернут в scope, то он не сохранит значения при входе и не восстановит при выходе. Все сломается. Чтобы это обойти, можно использовать шаблон небезопасного вызова. Вместо {{плохой шаблон|123|foo=bar}} нужно использовать {{~|плохой шаблон|123|foo=bar}}.