Шаблон:Scope/doc

Материал из Мракопедии
Перейти к: навигация, поиск

Этот шаблон предназначен для эмуляции локальных областей видимости.

Зачем это может быть нужно?[править]

Если вы пишете шаблон, у которого есть переменная 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

Значения внутри scope :
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

Значения внутри scope #2 (локальные только foo и bar) :
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

Значения на выходе из scope #2 :
foo = override!
bar = pwned,trollz
buzz = LOL
quux = TEMMIE COOL

Значения на выходе из scope #1 :
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}}.