WikiDer > Справка: Lua для начинающих - Википедия
РГ: Lua (разговаривать) | Помощь | Сделать | Ресурсы mw: справочное руководство |
Обзор
Lua это язык программирования, реализованный в Википедии с некоторыми существенными ограничениями через Скрибунто. Его цель - позволить вам обрабатывать данные, доступные на страницах содержимого Википедии, чтобы обеспечить различные виды настраиваемого отображения информации.
Самый важный файл справки - это Справочное руководство MediaWiki Scribunto Lua, который предоставляет краткую сводку вызовов языка и стандартных библиотек, реализованных в MediaWiki.
Общие, не связанные с MediaWiki Справочное руководство по Lua может - будучи очень хорошо написанным, всеобъемлющим и информативным - быть проблематичным для новичков, потому что некоторые функции не работают в Википедии, начиная с Распечатать()
, который появляется в стандартных программах Lua "hello world".
Проблемы с текущей реализацией
Помимо отсутствия Распечатать()
, отсутствуют другие функции - см. Отличия от стандартного Lua для полного списка.
В настоящее время рекомендуется использовать mw.ustring функции вместо нить, потому что последний иногда не работает с символами Unicode.
Вход
Программы запускаются только тогда, когда страница «проанализирована» (когда она или содержащаяся в ней страница изменяется или просматривается), а не каждый раз, когда вы просматриваете вывод. Поэтому не может быть удобного модуля Lua, который позволял бы вам вводить температуру по Фаренгейту в поле ввода и возвращать соответствующую температуру по Цельсию при нажатии кнопки или позволял бы вам щелкнуть сегмент визуализации набора Мандельброта на странице. расширять его сколько угодно раз. Должна существовать настоящая вики-страница (или, по крайней мере, страница, которую вы отправили для предварительного просмотра), содержащую входные данные.
Однако можно использовать библиотечные функции, такие как mw.title.new, для импорта содержимого с любой страницы текстового содержимого в Wiki. Однако вы не можете импортировать данные из файлов, даже из файлов .svg, содержащих текстовые данные XML.
Вызов модуля Lua
Вызовы Lua очень похожи на шаблоны, и состоит из небольшого блока текста, например
{{#invoke:ConvertNumeric| decToHex | 7733}}
Этот текст вызывает сам сценарий Lua, который находится в Модуль:
пространство имен. Результатом этого вызова является отправка информации в #invoke
block в модуль Lua и заменить все в скобках фрагментом текста, который он отправляет обратно. (Буквально в заявлении "возврат")
Обратите внимание, что первый «параметр» в данном случае decToHex
, на самом деле функция вызывается в модуле Lua. Это поле всегда должно быть включено в любой #invoke
. Тем, кто не знаком с модулями, особенно кодировщикам шаблонов Википедии, которые ожидают чего-либо после |
чтобы быть параметром, необходимость в этом дополнительном поле вызывает удивление, особенно если все использования модуля зависят от его наличия. При документировании вашей работы для них полезно включить явную инструкцию по использованию, например {{mlx | ConvertNumeric | decToHex | 7733}}
чтобы они поняли, что нельзя его пропустить.
Для многих существующих модулей пример #invoke
сценария (и многое другое) предоставляется на Обсуждение модуля:
страница. Авторам удобно иметь возможность быстро перейти на вкладку обсуждения, чтобы посмотреть на последствия своих изменений, но никогда не следует включать страницу обсуждения в качестве шаблона - люди могут действительно говорить на ней!
Другой пример: использование LuaCall для выполнения одной инструкции Lua
Как новичок или в обычном разговоре на странице обсуждения, у вас может быть только один небольшой расчет, для которого вы хотите использовать Lua, но не хотите писать полный модуль. Вы можете найти Модуль: LuaCall удобно для этого. Например, вы можете проверить, насколько жадный Шаблон Lua работает:
{{#invoke: LuaCall | main | a = bbbbbbbbbba | b = bb (. *) b (. +) bba | string.match (a, b)}}
→BBBB
или подсчитайте длину Вы знали крючок или текстовая часть Вы знали кандидат:
{{#invoke: LuaCall | main | a = ... что вы можете подсчитать длину вашего DYK-хука с помощью модуля Lua? | string.len (a)}}
→69
Однако в этих конкретных примерах Модуль: Строка может выполнять обе эти задачи.
Сценарий на Модуль: LuaCall был написан для приема любого набора именованных параметров somename = значение
, для каждого хранящего строку ценить
в переменной с именем какое-то имя
, а затем позволяет вам использовать эти переменные в качестве параметров для любой функции, доступной в Lua. Затем сценарий возвращает только первый значение, возвращаемое функцией (помните, что Функции Lua могут возвращать несколько значений, но в этом случае из модуля возвращается только первый).
Ошибки
Ошибки Lua отображаются в виде красных сообщений «Ошибка сценария». Если Javascript включен, красное сообщение об ошибке сценария - это ссылка что обычно позволяет вам вернуться к той строке в модуле, где произошла ошибка. Есть некоторые исключения, например, «Модуль не найден», если имя самого модуля введено с ошибкой, или «Указанная функция не существует», если заданное имя функции неверно.
Структура программы Lua: Вывод
Самая фундаментальная часть программы Wikipedia Lua - это возвращаться оператор, который переносит свой вывод обратно на страницу с #invoke
. Ты может иметь функцию Lua, которая выполняется без ошибок, даже если она не содержит оператора return, но в Википедии это бессмысленно, поскольку программы Lua обычно не могут иметь побочных эффектов в Википедии.
Сам модуль должен возвращать Lua стол ценностей. Таблица Lua представляет собой список значений, разделенных запятыми и заключенных в фигурные скобки. Когда модуль вызывается #invoke
, то функция его имя (первый аргумент после |) ищется в этой таблице. Эта функция, в свою очередь, должна возвращать что-то, что можно представить как нить.
Следовательно, return {mw.ustring.gmatch ("Привет, мир", "(. *)")}
на самом деле является полным модулем Lua (хотя и очень странным) - он возвращает функцию, возвращаемую mw.ustring.gmatch (функция итератора, указанная в ссылке на Lua, цитированной выше) как единственный и неповторимый элемент в массиве (представленном внутри {}
) - который при выполнении с использованием {{#invoke: ModuleName | 1}}
выдает строку «Hello world». тем не мение, обычно так не делают. Обычно мы используем общую форму:
местный п = {} - Определяет переменную p как пустую таблицу, но * не * nil.функция п.главный( Рамка ) - Этот блок определяет элемент таблицы p ["main"] как функцию. возвращаться "Привет, мир" - Строковый результат функции.конец - Завершает блок, определяющий объект функции p ["main"] (или p.main).возвращаться п - Это возвращает таблицу p, которая под ключом "main" содержит - функция выше (p.main), которая при вызове возвращает строку «Hello world».
Обратите внимание, что функция p.main (кадр) ... конец
эквивалентно p.main = функция (кадр) ... конец
или же p ["main"] = функция (кадр) ... конец
. Функция - это просто еще один тип значения, полученный с помощью ключа "главный"
из таблицы п
. Если вы хотите разрешить пользователям вызывать один и тот же модуль с {{#invoke:имя-модуля| привет}}
вместо {{#invoke:имя-модуля| main}}
, ты можешь написать p.hello = p.main
чтобы скопировать ссылку на эту функцию на новый ключ в таблице. Вы даже можете написать p [""] = p.main
, что приводит к {{#invoke:имя-модуля|}}
для получения того же результата, что и {{#invoke:имя-модуля| main}}
. Позже очень важно научиться думать о функциях как о типе данных для работы с такими библиотечными функциями, как mw.ustring.gsub
, и построение функций-итераторов.
Структура программы Lua: ввод
В Рамка
параметр выше (который почти всегда получает это имя в модулях Wikipedia Lua) получает другую таблицу, которая передается из страница, с которой звонят к модуль Lua. Он содержит удивительное количество материала, из которых лишь некоторые вещи беспокоят новичка.
Аргументы
frame.args
содержит еще один таблица, а именно весь контент, отправленный пользователем в #invoke
квадратные скобки, кроме первого аргумента, в котором указано имя функции, которая должна быть выполнена. Так что в {{#invoke:ConvertNumeric| decToHex | 3377}}
, Струна "3377"
это содержание frame.args [1]
(который совпадает с кадр ["аргументы"] [1]
но нет такой же как frame.args ["1"]
или же кадр ["аргументы"] ["1"]
). Для параметров без названия используются числа в качестве ключей (frame.args [1]
, frame.args [2]
и т. д.), а именованные параметры - с именами параметров (строками) в качестве ключей (frame.args ["количество"]
, frame.args ["стиль"]
, так далее.).
Пример:
{{#invoke:имя модуля|имя функции| 3377 | 4 | count = 3 | style = bold}}
приводит к
frame.args [1]
=3377,frame.args [2]
=4,frame.args ["количество"]
=3,frame.args ["стиль"]
="смелый"
.
Родительский фрейм
В Рамка
Существует родитель frame, ссылаясь на страницу, которая вызвала страницу, передающую сценарий, и вы также можете извлечь из нее аргументы. Просто пиши
parent = frame.getParent (кадр)
и parent.args
будет содержать эти аргументы.
В Lua популярно использовать синонимичный оператор parent = frame:getParent ()
, отменяя необходимость писать Рамка
дважды. Обратите внимание на двоеточие (:
) вместо точки (.
). родительский = кадр: getParent ()
означает то же самое, что и parent = frame.getParent (кадр)
. Для новичков это может сбивать с толку, и важно знать об этой идиоме. Однако, если вы используете его неправильно, ошибки сценария довольно хорошо указывают на то, что это была ошибка.
Базовая отладка
Отладка может начаться, как только вы напишете программы, и может быть выполнена просто с помощью конкатенации строк. Просто настройте переменную с некоторым узнаваемым именем, например, "debuglog", в вашей основной функции (p.main) с помощью такого оператора, как локальный отладчик = ""
. Это первоначальное определение помогает, потому что в противном случае оно будет ноль и объединение строки с nil приведет к ошибке. Теперь, когда у вас есть переменная, которую вы хотите протестировать, скажем x, просто напишите debuglog = debuglog .. "x =" .. tostring (x)
, и в конце вашей программы вернуть вывод .. debuglog
«Tostring» - это функция, обеспечивающая интерпретацию x как строку, поэтому, если это таблица, nil и т. Д., Она будет отображаться как «table», «nil» и т. Д., А не как ошибка сценария.
Формат
В WP: руководство по стилю Lua дает некоторые базовые предложения по форматированию, ожидаемые редактором модуля Javascript, такие как использование отступов с четырьмя пробелами и сохранение if, then, else, заканчиваются на том же уровне отступа.
Комментарии в конце строки помечаются знаком -. Используй их. Многие модули для Википедии имеют простой, линейный дизайн, но это не значит, что четкая маркировка ваших разделов не поможет, когда вы в сотый раз вернетесь к коду. Руководство по стилю Lua дает дополнительные рекомендации по использованию функций, чтобы ваша работа была более организованной.
Досадные ошибки
Некоторые ошибки, о которых стоит помнить:
- Попытка вызвать строковое значение. Это означает, что вы забыли ... между строкой и переменной где-то в беспорядке, который вы объединяете.
- Переменная игнорирует все ваши усилия по присвоению ей чего-либо. Вы могли случайно написать два локальные операторы - один устанавливает значение переменной в ограниченном регионе, и когда программа покидает этот регион, вы возвращаетесь к старому значению.
- Пронумерованная запись в таблице игнорирует все ваши попытки присвоить ей. Это потому, что ["50"] не является а [50]. Обычно вы обрабатываете параметр (который вы могли получить от вызова как строку) со строковыми функциями в одном месте, но выполняли числовые операции в другом, оставляя вам два разных типа переменных для использования в качестве индекса.
- Некоторая графика, которую вы пытаетесь отобразить, уходит в упадок. (на самом деле ошибка HTML) Вы не закрыли свои
x.somefield
или x [n], если Икс
равно нулю, объединить а .. б
если a или b равно нулю, или оценить a [x], если x равно нулю. Инициализируйте такие переменные с помощью (local) x = {}, a = "" и т. Д. Часто в этих ошибках упоминается "global", потому что у вас не было местный
оператор для переменной nil.- An список выражений представляет собой набор значений, разделенных запятыми. Значения могут быть строками, числами, таблицами, функциями и т. Д.
- А последовательность - это набор записей с индексами от 1 до N, где N - натуральное число. Их можно создать, заключив в скобки список выражений. Например, если
a = {1, "цитата", mw.ustring.gmatch ("abca", "a"), {2,3,4}}
тогдаа [1]
=1,а [2]
= "цитата",а [3]
функция, возвращаемаяgmatch ()
, иа [4]
это стол{2,3,4}
. Список выражений также можно восстановить из таблицы с помощьюраспаковать ()
:b, c, d = распаковать (a)
установитб
=1,c
= "цитата" иd
как функция, возвращаемаяgmatch ()
;{2,3,4}
будут отброшены в этом случае. - А стол представляет собой последовательность, необязательно дополненную именованными ключами:
цифра ["два"] = "2"
. Несколько табличных функций, напримерtable.concat
будет работать только с пронумерованными значениями и игнорировать именованные ключи. - В метатабильный предлагает большой необязательный набор методов для изменения поведения таблицы. Например, вы можете определить таблицу, которую можно вызывать как функцию.
Инициализация таблицы
Часто бывает полезно создать в операторе сразу всю таблицу. Есть много эквивалентных способов сделать это, но ярлыки работают не для всех типов значений. Начнем с того, что наиболее общий способ - явно назначить каждый ключ и значение:
a = {[0] = 'ноль', [1] = 'один', ['1'] = 'строка для одного'}
Если ключи последовательности (положительные целые числа) указаны по порядку, необходимо указать только значения, поэтому следующее будет назначать 'один'
к а [1]
:
a = {[0] = 'ноль', 'один', ['1'] = 'строка для одного'}
Если ключ состоит только из букв, цифр и подчеркиваний и начинается с цифры, скобки и кавычки можно опустить:
a = {a = 'один', b = 'два'}
Это идентично a = {["a"] = 'один', ["b"] = 'два'}
.
Однако это не удастся для ключей, которые начинаются с цифры: шестнадцатеричный = {7f = 127}
выдаст ошибку; использовать шестнадцатеричный = {['7f'] = 127}
вместо.
Обратите внимание, что при задании в скобки, или справа от знака равенства, нужны кавычки, иначе строковые значения будут приняты как переменные:
а = {[b] = c}
присваивает значение переменной c к ключу содержится в переменной б.
Функции
- Функции могут возвращать любое значение - включая функцию. Это мощная функция, которая может запутать новичка. Если вы установите
a = mw.ustring.gmatch (текст, «(.)»)
, результат, присвоенныйа
будет функция, а не строковый символ! Однако присвоениеб = а ()
вызывая функцию, хранящуюся ва
вернет первое совпадение (строку). Каждый раз, когда вы устанавливаетеб = а ()
после этого вы получите еще одно совпадение (строку) вб
, пока у вас не закончатся спички и вы не получитеноль
. Много функции итератора действовать таким образом. - Вы можете вести отдельные подсчеты для функций итератора, используя разные переменные. Например, если вы установите
q = mw.ustring.gmatch (текст, «(x.)»)
в том же модуле вы можете извлекать символы из одного и того же фрагмента текста (текст
) путем оценкиd = q ()
не теряя своего места ва ()
. - Хвостовые крики предлагают значительные преимущества в производительности для тех, кто владеет языком.
- Имена функций часто имеют форму «p.myFunctionName», где p - это таблица из «return p» внизу вашей программы. Причина этого в том, что вы можете получить доступ только к функциям, которые являются записями в этой таблице, из исходного оператора #invoke. Функции для локального использования в программе могут иметь любое имя.
Понимание закономерностей
Примечание: Шаблоны Lua нет обычные выражения в традиционном смысле POSIX, и они даже не являются подмножеством регулярных выражений. Но у них много общих конструкций с регулярными выражениями (подробнее ниже).
Шаблоны Lua используются для определения, поиска и обработки шаблон в строке. Он может выполнять обычные действия поиска и замены в тексте, но у него больше возможностей, чем выполнение только обычного текста. Например, за один раз он может изменить ошибки «Житель Нью-Йорка», «Житель Нью-Йорка» и «Житель Нью-Йорка» на «Житель Нью-Йорка».
- Начнем с того, что шаблон работает как обычная строка, если он не содержит специальных символов. ^ $ () % . [] * + - ?
- Квадратных скобках [ ] используются для соответствия один одиночный персонаж в строке из списка вариантов. [abc] соответствует буквам a, b или c. С ^ сразу после [ они обозначают «что угодно, но не»: [^ abc] = не a, b или c. Внутри скобок, если не первый символ, минус - указывает диапазон: [a-z] соответствует одному символу из a, b, c,…, z.
- Период . соответствует любому символу.
- Процентов % указывает на большой набор (класс) возможных совпадений символов, когда за ним следует буква. Видеть [1] для полного списка. Если за ним следует пунктуация (вне зависимости от того, является ли это специальным символом выше или нет),% удаляется, и пунктуация принимается как буквальный символ; %% = буквальный%. Специальные классы включают сбалансированный класс% bxy и% f [set]; см. ссылку выше для получения дополнительной информации.
- Скобки ( ) указать захваты. К полученным данным можно получить доступ позже в строке поиска или в строке замены string.gsub как от% 1 до% 9, и они возвращаются функцией string.match в виде списка результатов выражения.
- Отборочные ? - * + укажите повторение одного символа (не более длинной строки).
- ? означает 0 или 1 повторение: «а?» соответствует «а» или «».
- - означает 0 или более повторений, выбор как можно меньшего количества для достижения соответствия («нежадный»). Например, string.match ("bbbb", "(.-)") дает "", что менее чем полезно, потому что нет ничего, что могло бы укоренить концы выражения и предотвратить совпадение нулевых символов.
- * означает 0 или более повторений, выбирая как можно больше («жадные»). Например, string.match ("bbbb", ". *") Дает bbbb.
- + означает 1 или более повторений, выбирая как можно больше («жадные»).
Обратите внимание, что жадность крайний левый квалификатор превалирует над всеми остальными, когда есть выбор: (. *) b (. *) при сопоставлении с "bbb" вернет "bb", "", а a (.-) b (.-) a при сопоставлении с "abbba" вернет "", "bb".
- ^ и $ указывают начало и конец строки, если они встречаются в соответствующем месте в шаблоне. В противном случае это буквальные символы. ^ не используется в функции string.gmatch.
Справочное руководство по шаблонам Lua находится по адресу метавики.
Замечание о шаблонах Lua по сравнению с регулярными выражениями
Шаблоны Lua слабо основанный на обычные выражения (иногда сокращается до regex или regexp). В шаблонах Lua намеренно отсутствуют самые сложные конструкции регулярных выражений (во избежание раздувания базы кода Lua), тогда как многие другие компьютерные языки или библиотеки используют более полный набор. Шаблоны Lua даже не являются подмножеством регулярных выражений, так как есть также несоответствия, например, Lua с использованием escape-символа %
вместо \,
, и дополнения, такие как Lua, обеспечивающие -
как нежадная версия *
.
Вот список того, чего не хватает шаблонам Lua по сравнению с регулярными выражениями:
- Ты не можешь искать чередование чего-либо, кроме отдельных символов (вы не можешь сказать
(его | ее)
выбирать междуего
иее
ты можешь только сказать[abc]
выбирать между одиночными персонажамиа
,б
, или жеc
). - Ты не можешь ищите кратные конструкции из нескольких букв, такие как
(чу -) * чу
соответствоватьчу
,чу-чу
или жеChoo-choo-choo
. Это невозможно сделать с помощью шаблонов Lua. - Ты не можешь укажите минимальное и максимальное количество повторений, например
[0-9]{3,5}
(для соответствия от 3 до 5 цифр); в Lua вы бы сказали% d% d% d% d?% d?
вместо этого в этом случае.
Существуют библиотеки Lua, которые предлагают более мощные возможности,[2] включая регулярные выражения, но поддержка в Википедии довольно проста.
Справка Википедии по регулярным выражениям (которые Lua, как уже упоминалось, нет поддержка) находится на Википедия: AutoWikiBrowser / Регулярное выражение.