2012-04-26 9 views
13

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?

+1

Come si fa a definire "vuoto"? –

+0

Vuoto significato, non c'è nulla di scritto. – Village

+2

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. –

risposta

14

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.

+0

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

+0

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

+0

@snogglethorpe 'se nil poi \t di stampa ("a zero, è vero") altro \t di stampa ("nil non è vero!") FINE' -> nil non è vero! – handle

1

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 
+2

questo è abbastanza inefficiente; 'not not string.find (x," ^% s * $ ")' – daurnimator

+0

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

+0

'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

3

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