Qual è il modo corretto di fare un condizionale che controlli di qualcosa è o non è vuoto in Lua? if x == ""
e f x ~= ""
non sembrano funzionare.Come verificare se un valore è vuoto in Lua?
risposta
Lua è un in linguaggio dinamico basato su tipo.
Qualsiasi variabile può contenere uno dei seguenti tipi: nil, boolean, numero, stringa, tavolo, funzione, filo, o userdata.
Qualsiasi variabile in una tabella (incluso _G
, la tabella in cui risiedono i globals) senza un valore fornisce un valore di nil
quando indicizzato. Quando si imposta una variabile di tabella su nil
, in sostanza "non lo dichiara" (rimuovendo completamente la voce dalla memoria).
Quando viene dichiarata una variabile, se non viene assegnata immediatamente viene assegnato il valore nil
. A differenza della variabile di tabella, quando si imposta una variabile local
su nil
, è non "non dichiarato" (ha solo un valore di nil
).
In Lua, una stringa vuota (""
) è ancora un "valore" - è semplicemente una stringa di dimensione zero.
Penso che "_Quando si imposta una variabile su zero, in sostanza" non si dichiara "it_" è un po 'impreciso — 'nil' è un valore vero eccetto all'interno delle tabelle, quindi ad esempio, una variabile locale con un valore' nil' ancora ombre variabili negli ambiti circostanti ... – snogglethorpe
Hai assolutamente ragione; questa affermazione era rivolta alle coppie di tavoli, non a tutte le variabili in generale. La risposta è stata modificata per riflettere questo. – Deco
@snogglethorpe 'se nil poi \t di stampa ("a zero, è vero") altro \t di stampa ("nil non è vero!") FINE' -> nil non è vero! – handle
Probabilmente nella stringa vi sono spazi, righe nuove o altri caratteri non visibili. Quindi pensi che sia "vuoto", ma non lo è. Questo di solito accade quando stai prendendo input da parte dell'utente, e devi digitare "enter" per finire - il "enter" finisce nella stringa.
Quello che ti serve è una funzione che ti dice se la stringa è "vuota" - vuota, o un elenco di spazi/tabulazioni/nuove. Ecco un modo per farlo:
function isBlank(x)
return not not tostring(x):find("^%s*$")
end
Usage:
if isBlank(x) then
-- ...
end
questo è abbastanza inefficiente; 'not not string.find (x," ^% s * $ ")' – daurnimator
Bene, la tua versione è definitiva (una volta inclusa la chiamata tomming ommited). Non sono così sicuro che sia significativamente più veloce. Perché pensi che? – kikito
'string.gsub' assegnerebbe molta memoria per quell'operazione (una nuova stringa che viene ridimensionata diverse volte, uno o due buffer per le sostituzioni) rispetto a' string.find'. – Deco
Recentemente ho eseguito attraverso questo problema pure. LuaSQL restituiva stringhe vuote se un valore del database era "vuoto" (non nullo). Un approccio hacky, ma ecco come ho risolto:
if (string.len(x) >= 1) then
...
end
Come si fa a definire "vuoto"? –
Vuoto significato, non c'è nulla di scritto. – Village
Non è possibile "digitare" valori in variabili. Puoi dare una definizione più precisa? Perché una variabile che contiene la stringa "" "' non è "vuota". Ha una stringa. Vale a dire "" "'. Che è una stringa valida E quindi non nulla. –