Helpo:Lua/Programado
| |||
Kategorioj | |||
---|---|---|---|
Ŝablonoj | |||
| |||
Vidu ankaŭ | |||
Komentoj | |||
|
|||
Ĉi tiu paĝoj informas Lua-programmistojn pri kelkaj apartaĵoj de la lingvo, kiuj ne aŭ nur kaŝe estas prezentataj en la Scribunto-Tutorialo.
Krome ekzistas kelkaj helpopaĝoj pri kromtemoj:
- Modulo en Vikio – Integrado de la Lua-kodoj en la Vikian kuntekston
- frame-objekto – interfaco por la ŝablona programado
- Modulo por certa ŝablono – Subteni unuopan ŝablonon
- Signoĉenoj – String-funkcioj, Pattern (regulaj esprimoj) kaj tekstaj elementoj
- Ligiloj
- Ĉirkaŭaĵo – aktuala Vikia servilo kaj ĝia ekipaĵo
- Internaciigo
- Tutorial
Bibliotekoj
redakti- Parto de la lingvo Lua estas kelkaj normaj bibliotekoj. Tiom ili en la kunteksto de la Vikiaj paĝoj estas sencoplenaj, ili estas subtenataj.
- Krome Scribunto ofertas kiel objekton
mw
(por MediaWiki) kelkajn Viki-specifajn bibliotekojn, kiuj ankaŭ bone kooperas kun la cetera arkitekturo de Vikia servilo.
- Lua-baza lingvaĵo
- debug
- debug.traceback
- math – matematikaj funkcioj → Scribunto
- os
- package – ŝarĝado de moduloj → Scribunto
- string – signoĉenoj
- table → Scribunto
mw
(por „MediaWiki“) – Scribunto-bibliotekoj-
- mw.allToString()
- mw.clone()
- mw.getCurrentFrame()
- mw.incrementExpensiveFunctionCount()
- mw.loadData()
- mw.log()
- frame-objekto – interfaco por la ŝablona programado
- mw.language – Strukturi en la aktuala homa lingvo
- mw.message – Sistemaj mesaĝoj
- mw.site – aktuala Vikia projekto
- mw.text – signoĉenoj
- mw.title – Vikiaj paĝoj
- mw.uri – URL
- mw.ustring – signoĉenoj en Unikodo
- Ŝarĝeblaj Bibliotekoj
-
- prefere pli malofte necesaj → Scribunto
- bit32
- libraryUtil
- luabit
- ustring
Erarmesaĝoj
redaktiEstas kvar kaŭzoj por skriptaj eraroj:
- Sintaksaj eraroj
- Programadaj eraroj zur Einbindung
- Mankanta paĝo
- Eraro de uzanto dum enplektado
Per si mem Lua eldonas ĉe tio ĉiam nur unuopan erarmesaĝon: „skripteraro“. Tio estas enua kaj helpas al neniu ĉe la korektado. Krome estas plenigata la Kategorio:Paĝoj kun skripteraroj, tiel ke ankaŭ ne plu eblas superrigardi, kiu modulo kaŭzis eraron sur la tie listigitaj paĝoj.
Sintaksaj eraroj
redaktiSintaksaj eraroj estas ofte trivialaj skriberaroj. Tiu fakte devus kaŭzi, ke la konservado de la modul-paĝo ne eblas; escepte se oni donus al la kampo „⧼scribunto-ignore-errors⧽“ hoketon.
Ĉe la montrado de la paĝa antaŭrigardo de la modulo oni ricevas laŭeble kvalifikitan erarmesaĝon kune kun la linia numero. Ĉe gravas sintaksaj problemoj tio tamen ne povas esti farata kaj venas la lakona „skripteraro“.
Tipa kvalifikebla eraro estus unuopa punkto anstataŭ du por kunĉenado de signoĉenoj (PHP-stilo). Sen konkreta dono de helpo tamen restas mankanta then
aŭ end
sed ankaŭ ne fermita signoĉeno.
Programadaj eraroj ĉe enplektado
redaktiSe pro la programa strukturo en kelkaj kazoj estiĝas netaŭgaj datumtipoj, en kelkaj ne, tio estas malfacile trovebla. Se tiam ekzemple oni provas, apliki al nil
signoĉenan funkcion, tio redonas la konatan nedifinitan eraron. Por la enplektanto de ŝablono tio ne estas solvebla. Laŭeble ĉiuj padoj tial estu traludataj sur testopaĝoj, kaj la kondiĉoj rilate la datumtipon kaj aron de valoroj estu kontrolataj en la funkcioj.
Mankanta paĝo
redaktiSe paĝo estas transkludata, povas esti, ke ĉi tiu paĝonomo ne ekzistas; precipe la atendata paĝo estis alinomigita aŭ ĉe la komponado de kunmetita nomo okazis eraro. Por povi solvi ĉi tiun situacion, estas bezonata preciza informo, kiu paĝo mankas. LuaWiki.transclude() ebligas certan enplektadon kaj zorgas por preciza erarmesaĝo.
Eraro de uzanto ĉe la enplektado
redaktiKion ajn la ŝablonaj programistoj kaj enplektistoj de ŝablono enmetas kiel parametrojn, devas esti analizata kaj ĉe problemoj esti provizata kun konkreta mesaĝo, por ke korektado ebliĝu.
Defensiva programado estas konsilinda.
- Ĉiu enmetaj valoroj estas kiel eble mankantaj aŭ sintakse malĝustaj rigardata, ĝis kiam la malo estis konstatita.
- Efektive ĉeestantaj parametroj en
#invoke
estas almenaŭ ĉiam de la tipo string.
Helpaj funkcioj
redakti- pcall()
- Kraŝosekura ekzekutado de funkcio
fun
kun parametra listoargs
. e, v = pcall( fun, args )
- Ĉe tio
e
estas en kazo de erarofalse
kajv
la erarmesaĝo. - Se neniu problemo aperis, tiam
e
havas la valorontrue
kajv
krom ĉiuj sekvaj variabloj estas la kutimaj redonaj valoroj defun
. pcall
staras por protected call.- Tio respondas al catch.
- assert()
assert( v, message, ... )
- Kaŭzu skriptan interrompon kun kvalifikata erarmesaĝo, se kondiĉo ne estas plenumata.
- Respondas proksimume al
error()
, sed nur, se la kondiĉo v ne estas plenumata (do estasnil
aŭfalse
). - Kiel
message
estu kundonata specifa erarmesaĝo; alie estus lapidara assertion failed! – almenaŭ ĉiam estas montrata la linia numero de laassert
en la mesaĝo, krom la nomo de la modulo. - Se v ne estas
nil
nekfalse
, ĉiuj argumentoj inklude de v kaj message estas redonataj. - La alvoko estas sencoplena nur ene de ĉirkaŭaĵo protektata per
pcall()
; alie estas kaŭzata nur ĝenerala „skripteraro“ sen pliaj detaloj. - Senco de la afero estas, doni en pli profunda ebeno de la funkcia hierarkio por v funkcion, kiu kontrolas la validecon de la transdonita al ĝi valoroj. Ĉe malfunkcio estas saltata rekte en la ebenon kun
pcall()
; ekzemple la interfaco al#invoke
. Per tio oni ŝparas al si la transdonon de specifaj redonaj valoroj de funkcio al funkcio. - La funkcio respondas al throw.
- error()
- Ĉi tiu funkcio ebligu skriptan interrompon kun kvalifikita erarmesaĝo.
error( message, level )
- La alvoko estas nur sencoplena ene de ĉirkaŭaĵo protektata per
pcall()
; alie estas nur kaŭzata ĝenerala „skripteraro“ sen pliaj detaloj. - Ene de la funkciaro eliĝanta de
pcall()
estas redonata la erarmesaĝomessage
. - La nedeviga parametro
level
estas en la origina lingvo Lua alvoka sekvo aŭ stack, kies montrenda profundo povas esti difinata.- Nuntempe en Scribunto estas montrataj nur la nomo de la modulo kaj la linia numero, kaj tio nur sur unu ebeno. Tio estas eble ankoraŭ ne finita situacio. La konstruo de Vikiaj paĝoj kaj la certa traktado de Lua-dosieroj estas iomete malsamaj.
- Se
level
ne estas donata aŭ estas nulo aŭ tro granda, tiam ne estas montrata informo pri la loko. - Rekomendas nuntempe, doni
level
ĉiam kun1
aŭ tute ne.
- La baza ideo similas al tiu de
assert()
. - La funkcio respondas al throw.
- LuaWiki.*
- Alvokoj de la Vikia ĉirkaŭaĵo.
- Ĉi tiu funkcio analizas la transdonitajn parametrojn kaj zorgas por preciza erarmesaĝo.
Malplenaj valoroj
redaktiAlie ol ĉe aliaj programadaj lingvoj validas en la C-tradicio:
- La malplena signoĉeno
""
estas „io“. - Nur
nil
kajfalse
kaj la numero0
estas „nenio“. - Malplena table
{}
estas samsignifa kunnil
.
Tio estas antaŭ ĉio grava por if
-informpetoj.
Table kaj objekt
redaktiAl valoroj kaj funkcioj kiel komponaĵo de table estas alirataj per .
kiel t.k
, krom la notado t["k+"]
ankaŭ por nomoj de komponaĵoj, kiuj ne estas pure alfanumeraj.
Ĉe objekto (instanco, per biblioteko ofertata de Lua aŭ Scribunto) estas alirata al trajtoj same per .
. Por funkcioj (metodoj) estu uzata male :
. Ekzemplojn vidu String-funkcioj.
La notado per duobla punkto ne validas nur por Lua- kaj Scribunto-objektoj, sed ankaŭ por uzantodifinitaj objektoj. Ĉe tio la metodo implicite ricevas aldonan parametron self
, al kiu povas alirata ene de la metodo. Ĉi tiu reprezentas la instancon de la objekto-table, dum ke la table respondus al „klaso“. La du instrukcioj
function meinObjekt:f ( params ) body end
kaj
meinObjekt.f = function ( self, params ) body end
estas ekvivalentaj.
Ĉe funkcioj en objektoj (metodoj) krome estas la eblo, uzi nomitajn argumentojn. Anstataŭ rondaj krampoj tiam estu uzataj kunigaj krampoj {}
. Ĉi tiu formato estas plej ofte aldona opcio; en kelkaj kazoj kiel ĉe [[../Modulo en Vikio#expandTemplate{}|frame:expandTemplate{}
]] sed la ununura subtenata aliro.
or: De maldekstre dekstren
redaktiTrajto de la or
-operatoro, kiu oni povas utiligi al si por la subteno de la ŝablona programado, estas la cirkonstanco, ke ĝi redonas la maldekstre starantan disjunkcian esprimon, se tiu ne estas nil
nek false
, kaj alie la esprimon de la dekstra flanko.
Per tio ankaŭ povas esti certigata datumtipoj ĉe mankantaj informo:
saveString = frame.args.optional or ""
saveTable = getTable() or {}
Se la valoro ĉe tio estas malplena kaj/aŭ de malĝusta datumtipo, tiam ĝi estas pravalorizata kun la ĝusta datumtipo.
Ĉar ofte bibliotekaj funkcioj en certaj situacioj nil
aŭ false
redonas, sed ĉi tiuj signoĉenoj ne aperu kiel rezulto de la ŝablona enplektado, oni povas ekzemple vere „malplenan“ valoron certigi per la sekva instrukcio:
return fun(x) or ""
Se fun(x)
redonas realan valoron, tiam tiu estas redonataj al la #invoke
; se tio estas nenio, tiam efikas la ""
.
Analoge oni povas certigi la valoron 1
ĉe „nenio“ aŭ „io“:
return fun(x) and "1" or ""
Ĉar ĉi tiu notado ne plu estas tre superrigardebla, oni ne tro ofte uzu ĉi tiun trukon.
Sinsekvo de lokaj funkcioj
redaktiLa sinsekvo de lokaj funkcioj estas signifa. Loka funkcio devas esti difinita en la fizika ordo de la difinoj, antaŭ ol ĝi povas esti uzata.
"For"-iteracio
redaktiĈe For-iteracio (de:Zählschleife)
for v = e1, e2 do
la argumentoj estas analizataj nur unufoje ĉe la komenco; poste transigataj en internajn variablojn.
Ne eblas, ene de la iteracio elvoki la finan kondiĉon, ekzemple per e1=e2
. Kontraŭe devas esti ekzekutata break
-instrukcio.
Tondeti signoĉenajn parametrojn
redaktiNenomitaj signoĉenaj parametroj estu ĉiam tondetaj, se ili devenas el ŝablonoj kaj interspacaj signoj ne estus signifaj. En la ŝablona programado tio estis ebla nur per trukoj:
{{#if:trim|{{{1}}}}}
En Lua la maniero estus biblioteka funkcio, se estas certigite, ke s estas signoĉeno:
s = mw.text.trim( s )
Uzantodifinitaj objektoj
redaktiEstus aŭdace, rigardi Lua kiel objektorientitan lingvon. Tamen povas esti aranĝataj per metatable de table kelkaj objektecaj trajtoj.
Per tio povas esti difinataj specifaj metodoj por:
- Aliro al elemento, nova elemento, kunigo, longo, komparo, aritmetikaj operacioj.
Ĉar la table sen tio povas enhavi funkciojn kiel elementojn, povas esti kreataj laŭ speco de memdifinebla objekto metodoj kaj ecoj kaj ankaŭ asignataj per genera funkcio al ĉiuj instancoj de „klaso“; tiuj povas esti eĉ konvene heredataj kaj superskribataj. Tio oni ne kredas kapabla al ĉi tiu simpla lingvo je la unua rigardo.