modo più efficace per determinare se una tabella Lua è vuota (non contiene voci)?

StackOverflow https://stackoverflow.com/questions/1252539

  •  12-09-2019
  •  | 
  •  

Domanda

Qual è il modo più efficace per determinare se una tabella è vuota (ovvero, attualmente non contiene né valori array-stile, né valori dict-style)?

Al momento, sto usando next():

if not next(myTable) then
    -- Table is empty
end

C'è un modo più efficiente?

Nota: L'operatore # non basta qui, in quanto opera solo sui valori matrice stile della tabella - così #{test=2} è indistinguibile da #{} perché entrambi ritorno 0. Si noti inoltre che il controllo se la variabile di tabella è nil no basti come io non sono alla ricerca di valori nulli, ma piuttosto tavoli con 0 voci (cioè {}).

È stato utile?

Soluzione

Il tuo codice è efficiente ma sbagliato. (Considerare {[false]=0}.) Il codice corretto è

if next(myTable) == nil then
   -- myTable is empty
end

Per la massima efficienza si desidera associare next a una variabile locale, per esempio,

...
local next = next 
...
... if next(...) ...

Altri suggerimenti

Una possibilità potrebbe essere quella di contare il numero di elementi, utilizzando il tasto metatabella "NewIndex". Quando si assegna qualcosa che non nil, incrementare il contatore (il contatore potrebbe vivere nel metatabella pure) e quando viene assegnato nil, decrementare il contatore.

Test per tavolo vuoto sarebbe di testare il contatore con 0.

Ecco un puntatore a documentazione metatabella

Mi piace la vostra soluzione, però, e onestamente non posso presumere che la mia soluzione è più veloce nel complesso.

Questo è probabilmente quello che si voleva:

function table.empty (self)
    for _, _ in pairs(self) do
        return false
    end
    return true
end

a = { }
print(table.empty(a))
a["hi"] = 2
print(table.empty(a))
a["hi"] = nil
print(table.empty(a))

Output:

true
false
true

So che questo è vecchio, e potrei essere equivoco in qualche modo, ma si vuole solo la tabella di essere vuota, vale a dire, a meno che non si sta solo controllando se è e che in realtà non vogliono o hanno bisogno per essere vuota, è possibile cancellarlo semplicemente ricreando esso, se non mi sbaglio. questo può essere fatto con la sintassi di seguito.

yourtablename = {} -- this seems to work for me when I need to clear a table.

meglio evitare la valutazione di __eq caso di sovraccarico.

if rawequal(next(myTable), nil) then
   -- myTable is empty
end

o

if type(next(myTable)) == "nil" then
   -- myTable is empty
end

prova serpente, lavoro per me

serpent = require 'serpent'

function vtext(value)
  return serpent.block(value, {comment=false})
end

myTable = {}

if type(myTable) == 'table' and vtext(myTable) == '{}' then
   -- myTable is empty
end

Che ne dici di questo?

if endmyTable[1] == nil then
  -- myTable is empty
end

Provare a usare #. Esso restituisce tutte le istanze che si trovano in una tabella. Se non ci sono casi in una tabella, poi ritorna 0

if #myTable==0 then
print('There is no instance in this table')
end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top