Dal Lua 5.1 documentation for load()
:Comportamento di carico() quando la funzione pezzo ritorna nil
carichi un pezzo utilizzando la funzione
func
per ottenere i suoi pezzi. Ogni chiamata afunc
deve restituire una stringa che concatena con i risultati precedenti. Un ritorno di una stringa vuota, nil, o nessun valore indica la fine del blocco.
Dal mio test, questo non è effettivamente vero. O, piuttosto, la documentazione è almeno fuorviante.
considerare questo script di esempio:
function make_loader(return_at)
local x = 0
return function()
x = x + 1
if x == return_at then return 'return true' end
return nil
end
end
x = 0
repeat
x = x + 1
until not load(make_loader(x))()
print(x)
L'uscita è il numero di chiamate successive alla funzione restituita da make_loader()
che ha restituito nil
prima load()
dà e restituisce una funzione che restituisce nulla.
Uno si aspetterebbe che l'output qui sia "1" se la documentazione deve essere presa al valore nominale. Tuttavia, l'output è "3". Ciò implica che l'argomento load()
viene chiamato finché non restituisce nil
tre volte prima che load()
si arrenda.
D'altra parte, se la funzione di blocco restituisce immediatamente e poi nil
sulle chiamate successive una corda, ci vuole solo un nil
Per interrompere il caricamento:
function make_loader()
local x = 0
return {
fn=function()
x = x + 1
if x == 1 then return 'return true' end
return nil
end,
get_x=function() return x end
}
end
loader = make_loader()
load(loader.fn)
print(loader.get_x())
Questo stampa "2" come mi sarei aspettato.
Quindi la mia domanda è: la documentazione è sbagliata? Questo comportamento è desiderabile per qualche motivo? È semplicemente un bug in load()
? (Sembra apparire intenzionale, ma non riesco a trovare alcuna documentazione che spiega perché.)
Hai provato Lua 5.2? –
@NicolBolas No. – cdhowie
Si potrebbe desiderare di provarlo. Probabilmente è solo un bug in Lua 5.1. –