Ajutor: Lua

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Aceasta este o introducere pentru a oferi o primă orientare pentru cei noi în Lua (limba utilizată în module ), o caracteristică a software-ului MediaWiki furnizat de extensia Scribunto . Nu este destinat să fie un ghid general pentru programarea în Lua (există deja multe pe Web), ci pentru utilizare specifică în cazul modulelor Wikipedia.

Dacă nu sunteți interesat de programare, ci doar de utilizarea modulelor pre-scrise, consultați paginile aferente .

Generalitate

Lua este un limbaj de programare implementat pe Wikipedia cu unele restricții substanțiale folosind Scribunto . Scopul său este de a vă permite să procesați datele disponibile pe paginile Wikipedia pentru a organiza afișarea într-un mod personalizat.

Documentația principală a Wikipedia în italiană este manualul de referință pentru Lua , care oferă un rezumat concis al limbii și bibliotecilor standard. Manualele originale de referință ale limbii sunt bine scrise și ușor de înțeles, dar ar putea fi problematice pentru începători, deoarece au unele caracteristici care nu sunt compatibile cu Wikipedia .

Creați un formular de testare

Deoarece modulele funcționează numai în spațiul de nume cu același nume, există pagina Module: Sandbox pentru testare (similar cu Wikipedia: Pagina de testare pentru experimentele obișnuite de editare). Dacă doriți să creați un formular de test, îl puteți face într-o subpagină a Formularului: Sandbox creând unul cu numele dvs. de utilizator, astfel: Formular: Sandbox / YourUserName / FormName .

Implementare curentă

În acest moment, pentru a manipula șirurile, este recomandabil să utilizați funcțiile bibliotecii mw.ustring în locul mw.string , deoarece acesta din urmă nu poate gestiona caractere Unicode și poate produce erori aleatorii sau comportament neașteptat (de exemplu, coduri precum "UNIQ5ae8f2aa414ff233 -h-3 - QINU "în textul transcris).

Apelați un modul Lua

Exemplu de apelare a unui modul Lua

Apelarea unui modul Lua este similară cu apelarea unui șablon și constă dintr-un mic bloc de text precum {{#invoke:HelloWorld|hello}} .

Acest text invocă scriptul Lua „HelloWord” găzduit în spațiul de nume Module. Efectul apelului este de a trimite informațiile incluse în blocul de invoke către modulul Lua și de a înlocui ceea ce este conținut în paranteze cu textul returnat de modul.

De fapt, primul „parametru”, în acest caz „salut”, este de fapt apelul unei funcții conținute în modulul Lua. Acest câmp trebuie să fie întotdeauna inclus în #invoke . Cei obișnuiți să folosească șabloanele normale de Wikipedia se așteaptă ca tot ce apare după primul | a fost un parametru și prezența acestui câmp l-ar putea confunda. Prin urmare, atunci când documentați un modul, este util să includeți exemple explicite de utilizare, cum ar fi {{#invoke:HelloWorld|hello}} , astfel încât să vă amintiți să îl compilați.

Dacă apare o eroare de execuție, blocul de invoke fi înlocuit cu roșu „scribe-parser-error⧽”. Dacă JavaScript este activat în browserul dvs., puteți face clic pe mesaj pentru a deschide o fereastră pop-up care conține o descriere detaliată a erorii și, de obicei, un link direct la linia care trebuie corectată. Există câteva excepții, de exemplu în cazul „Eroare script: niciun modul„ $ 2 ”.” sau „Eroare script: funcția„ $ 2 „nu există." dacă numele modulului sau funcției sunt greșite.

Ieșire

Partea cheie a unui modul Lua este instrucțiunea return , care returnează rezultatul funcției la pagina care conține # invoke. Este posibil ca o funcție Lua să nu conțină o instrucțiune return, dar atunci ar fi inutil să o apelați.

Modulul trebuie să returneze un tabel de valori, care în Lua sunt exprimate ca o listă de obiecte separate prin virgule între paranteze. Când modulul este apelat de comanda #invoke, primul parametru al comenzii (numele funcției) este căutat în tabelul exportat. Funcția este apoi apelată și trebuie să returneze ceva reprezentabil ca un șir .

De obicei, un modul Lua va avea acest formular:

 - Toate modulele Lua de pe Wikipedia trebuie să înceapă prin definirea unei variabile de tip tabel care conține
- funcțiile accesibile din exterior. Poate avea orice nume și poate conține și alte date.
local p = {}

- Se adaugă o funcție variabilei. Acest lucru poate fi reamintit din Wikipedia folosind
- comanda #invoke.
- Argumentul „cadru” va conține datele pe care Wikipedia le trimite acestei funcții atunci când vine vorba
- apel.
funcția p . salut ( cadru )
    - Următoarea declarație încheie funcția și returnează șirul „HelloWorld” în Wikipedia.
    - Funcția va fi afișată în loc de a invoca comanda #invoke.
    întoarce-te "Bună, lume!"
- Finalizați funcția.
Sfârșit

- Modulul trebuie să se termine prin returnarea variabilei care conține funcțiile sale în Wikipedia.
retur p

- Acest modul poate fi folosit acum apelând {{#invoke: HelloWorld | hello}}.
- Comanda #invoke începe cu numele modulului, în acest caz „HelloWorld”,
- apoi numele uneia dintre funcțiile sale ca argument, în acest caz „salut”.

Intrare

Programele rulează numai atunci când pagina este analizată „sintactic” (adică atunci când aceasta sau o pagină care o încorporează este editată sau previzualizată), nu de fiecare dată când este vizualizată. Prin urmare, nu este posibil să creați un modul Lua care vă permite să introduceți o temperatură în Fahrenheit și să obțineți valoarea sa în Celsius sau să faceți clic pe un segment al unui set Mandelbrot pentru ao extinde. Trebuie să existe o pagină Wiki (sau cel puțin o pagină pentru care a fost solicitată o previzualizare) care conține datele de intrare. Cu toate acestea, puteți utiliza funcții de bibliotecă precum mw.title.new pentru a importa conținut din orice text de pe Wiki. Cu toate acestea, nu puteți importa date din fișiere, nici măcar din cele în format .svg (în ciuda faptului că este un format XML textual).

Când funcția p.hello este apelată, primește un argument de tip tabel care conține diverse informații transmise de pagina Wikipedia care face apelul către {{#invoke:HelloWorld|hello}} , inclusiv argumentele apelului în sine. Argumentul Funcția poate avea orice nume Lua valid, dar în mod convențional numele frame este folosit pe Wikipedia.

frame conține un alt tabel, frame.args , care la rândul său conține parametrii trecuți în apelul #invoke (cu excepția primului parametru, folosit doar pentru a selecta numele funcției de executat).

Parametrii poziționali

  • Dacă funcția len a modulo: String este apelată cu {{#invoke:String|len|Pippo}} , atunci frame.args[1] va conține șirul "Foo".
  • Cu instrucțiunea {{#invoke:HelloWorld|hello_nome1|Pippo|come va}} Funcția hello_nome1 a modulului: HelloWorld va fi apelată, la care doi parametri conținând respectiv șirurile „Pippo” și „cum te duci” va fi trecut. Acestea vor fi accesibile în cadrul modulului prin frame.args[1] și frame.args[2] .

Parametri nominali

Parametrii nominali sunt indexați cu un nume pentru parametru. Un exemplu de apel cu parametri nominali este {{#invoke:HelloWorld|hello_nome2|nome=Pippo|saluto=come va}} , în care va fi apelată funcția hello_nome2 , care va primi cei doi parametri nome și saluto , care conține șirurile „Foo” și ce mai faci ”. În acest caz, conținutul lor va fi accesibil cu instrucțiunile frame.args["nome"] și frame.args["saluto"] .

Când numele parametrilor conțin doar caractere alfabetice, numere și caracterul de subliniere (și nu încep cu un număr), valoarea lor poate fi accesată și cu instrucțiunea frame.args. nome_parametro , deci în exemplul de mai sus cu frame.args.nome și frame.args.saluto .

cadru: getParent

frame conține un indicator către argumentul „părinte”, cel al modulului invocat, util pentru recuperarea argumentelor în cazul unei funcții apelate dintr-un șablon , atunci când acesta este inclus într-o altă pagină. Comanda este suficientă

 local args = cadru . getParent ( cadru ). argumente

iar tabelul args va conține aceste argumente.

O prescurtare pentru comanda de mai sus este frame:getParent().args , unde parametrul ( frame ) este implicat de frame:getParent().args .

Debuglog

Modulul poate fi testat de la început, pur și simplu utilizând concatenarea șirurilor. Trebuie doar să adăugați o variabilă cu un nume recunoscut precum "debuglog" în funcția de analizat, cu o declarație precum local debuglog = "" (trebuie inițializată cu un șir gol, altfel ar avea o valoare nil și concatenarea unui șir ar generează o eroare). Sintaxa pentru testarea unei variabile x este următoarea:

 debuglog = "x =" .. tostring ( x )

Funcția de tostring împiedică să tostring greșeli: va forța întotdeauna valoarea variabilei x chiar și în prezența tabelelor Lua sau a valorilor nule.

La sfârșitul modulului este esențial să introduceți return output .. debuglog , unde „ieșire” indică valoarea care trebuie returnată (dacă a fost stabilită anterior) la care valoarea de debuglog este concatenată.

Dacă valoarea de testat este un tabel sau altă variabilă complexă, puteți folosi următorul cod:

 debuglog = "x =" .. mw . text . jsonEncode ( x , mw . text . JSON_PRETTY )

Sugestii de stil

  • Utilizați tabulatorul pentru indentare .
  • Limitați lungimea unei singure linii, astfel încât persoanele cu monitoare mai mici să poată citi codul cu ușurință. O linie care este prea lungă poate fi împărțită în mai multe linii cu indentarea aliniată cu consola de deschidere. Condițiile unei instrucțiuni if ar trebui plasate pe o linie ulterioară.
  • Evitați spațiile inutile în apeluri funcționale și de tabel, înainte sau după paranteze de deschidere ( [, (, { ) și închidere ( ], ), } ).
  • Împărțiți mai multe afirmații pe linii diferite, cu excepția cazului în care sunt foarte scurte.
  • Lasă comentarii cu un dublu - . Folosirea lor este cu adevărat utilă: chiar și în cele mai simple module, comentariile clare ajută la modificarea unor coduri scrise de alți autori sau care nu au fost modificate de ceva timp.

Erori

Câteva greșeli tipice:

  • O variabilă ignoră orice încercare de a-i atribui o valoare. Există două instrucțiuni local și prima setează valoarea într-o regiune limitată a modulului: părăsind regiunea respectivă, aceasta este aruncată în favoarea instrucțiunii generale (rămânând la vechea valoare).
  • O valoare de tabel numerotată ignoră încercările de a-i atribui alta. Acest lucru se datorează faptului că a["50"] ≠ a[50] . Prelucrarea unui parametru care face referire la o funcție cu o singură linie, cu a doua valoare numerică plasată pe o linie diferită, lasă modulul cu două tipuri diferite de variabile de utilizat ca index.
  • Încercați să apelați o valoare șir. Identificatorul .. fost uitat între un șir și o variabilă într-o secvență de concatentare.
  • ... zero ... O valoare nulă împiedică mai multe acțiuni, de exemplu atribuirea unei valori la a.1 dacă a este nil sau concatenarea a .. b dacă una dintre cele două este nil . Este esențial să inițializați variabilele cu valori precum local a = "" local a = {} sau local a = {} . În absența unei variabile inițializate cu local , global folosește adesea și global .
  • șirul așteptat, a primit funcția. Unele funcții precum mw.ustring.gmatch returnează funcții și nu șiruri.

Noțiuni de bază

  • O listă de expresii este un set de valori (șiruri, numere, tabele, funcții etc.) separate prin virgule.
  • O secvență este un set de valori cuprinse între 1 și N (unde N este un număr întreg pozitiv). Poate fi creat prin încadrarea unei liste de expresii între paranteze. De exemplu, dacă a = {1, "quotation", mw.ustring.gmatch( "abca", "a" ), {2, 3, 4}} atunci a[1] = 1 , a[2] = "quotation" , a[3] echivalent cu valoarea returnată de funcția gmatch și a[4] este tabelul {2, 3, 4} . O listă de expresii poate fi extrasă dintr-un tabel cu unpack() : b, c, d = unpack(a) returna b = 1 , c = "quotation" și d la funcție.
  • Un tabel este o secvență acceptată opțional de taste numite, de exemplu digit["two"] = "2" . Cu toate acestea, trebuie amintit că mai multe funcții, cum ar fi table.concat necesită în mod necesar indexuri numerice și ignoră aceste tipuri de chei.
  • Un metatabil oferă mai multe moduri de a modifica comportamentul unui tabel. De asemenea, vă permite să definiți unul astfel încât să poată fi apelat ca funcție.

Funcții

  • O funcție poate returna orice tip de variabilă, inclusiv o funcție . Aceasta este o caracteristică puternică care ar putea deruta un începător. Un exemplu este instrucțiunea a = mw.ustring.gmatch( text, "(.)" ) Care vor atribui a o funcție și nu valoarea unui șir de caractere. În acest caz, funcția va returna la fiecare apel unul dintre caracterele text șir până când se termină și returnează nil . Multe funcții iteratoare acționează exact așa.
  • Este posibil să se păstreze conturi separate pentru funcțiile iteratorului, folosind diferite variabile. Declarația q = mw.ustring.gmatch( text, "(.)" ) Va extrage caractere din același șir ca în exemplul anterior evaluând d = q() fără a afecta comportamentul a() .
  • Funcțiile care trebuie apelate cu comanda {{#invoke|...}} sunt de obicei definite în forma p.myFunctionName , unde p este tabelul returnat de modul. Alte funcții vor fi locale și pot avea orice nume valid, dar nu vor fi accesibile din exterior.

Module de asistență

Există câteva module de suport pentru dezvoltarea de module și șabloane:

Forma: Argumente
Simplificați gestionarea parametrilor trecuți de #invoke. În principal elimină argumentele goale și șterge spațiile de la sfârșitul argumentelor, citește argumentele din cadrul curent și cadrul părinte. Sunt posibile diverse personalizări ale comportamentului său.
Formă: fără globali
Verificați dacă modulul în care este apelat nu citește variabile globale nule și nu creează altele noi, cu excepția variabilei "arg" (este nevoie de Scribunto, vezi mai sus). Este util pentru detectarea erorilor de programare.
Modul: verificare parametru necunoscut
Adăugat în partea de jos a unui șablon, vă permite să verificați dacă este apelat numai de parametrii furnizați de șablonul însuși.
Formă: șir
Vă permite să utilizați funcții de manipulare a șirurilor în șabloane (calculați lungimea, verificați dacă un șir este conținut într-un altul), înlocuiți caracterele accentuate cu cele fără accent, înlocuiți un șir cu altul.

Pagini conexe