Jaki jest najbardziej efektywny sposób określenia, czy tabela jest pusta (to znaczy, że obecnie nie zawiera wartości w stylu tablicowym ani w stylu dyktowania)?
Obecnie używam next()
:
if not next(myTable) then
-- Table is empty
end
Czy jest bardziej efektywny sposób?
Uwaga: #
Operator nie jest tutaj wystarczający, ponieważ działa tylko na wartościach tablicowych w tabeli - dlatego #{test=2}
jest nie do odróżnienia, #{}
ponieważ oba zwracają 0. Zwróć również uwagę, że sprawdzenie, czy zmienna tabeli jest nil
niewystarczające, ponieważ nie szukam wartości zerowe, ale raczej tabele z 0 wpisami (tj {}
.).
false
nie byłby to oczekiwany klucz, więcif not
zadziałało dobrze, ale prawdopodobnie będę miał nawyk porównywania gonil
w przyszłości, po prostu jako dobry nawyk. I tak, powiązałem typowe funkcje narzędziowe z lokalnymi zmiennymi w celu zwiększenia szybkości. W każdym razie dziękuję za wkład.local next
?local next
w bieżącym bloku znajduje się element, użyje go, a następnie wejdzie do następnego bloku i powtórzy. Gdy wyjdzie z lokalnych, będzie używać tylko globalnej przestrzeni nazw. Jest to okrojona wersja tego, ale ostatecznie oznacza to zdecydowanie różnicę w szybkości działania programu.Jedną z możliwości byłoby policzenie liczby elementów przy użyciu klucza metatable „newindex”. Kiedy przypisujesz coś nie
nil
, zwiększ licznik (licznik może również mieszkać w metatabeli), a podczas przypisywanianil
zmniejsz licznik.Testowanie pustej tabeli polegałoby na przetestowaniu licznika z 0.
Oto wskaźnik do metatowalnej dokumentacji
Jednak podoba mi się twoje rozwiązanie i szczerze mówiąc nie mogę założyć, że moje rozwiązanie jest ogólnie szybsze.
źródło
nil
jest przypisany, ponieważ __newindex nie jest wyzwalany, jeśli klucz już istnieje w tabeli.__index
i__newindex
, jak i przechowywać rzeczywiste dane w tabeli-cieniu i utrzymywać rzeczywistą tabelę pustą, aby w__index
ogóle została wywołana. Myśląc na głos, podejrzewam, że podniesiony koszt każdego wyszukiwania nie może być tego wart.Prawdopodobnie tego chciałeś:
Wynik:
źródło
next()
jest bardziej wydajna (i bardziej zwięzła) niż pętlapairs()
.pairs()
to zasadniczo tylko użycie tejnext()
techniki, ale z większym narzutem.table
Nie zaleca się również pisania do biblioteki standardowej .lepiej unikać oceny __eq, jeśli jest przeciążony.
lub
źródło
spróbuj węża, pracuj dla mnie
źródło
Co powiesz na to ?
źródło
Wiem, że to jest stare i mogę cię jakoś źle zrozumieć, ale jeśli chcesz, aby stół był pusty, to znaczy, chyba że po prostu sprawdzasz, czy tak jest i nie chcesz lub nie potrzebujesz, aby był pusty, możesz go wyczyścić, po prostu odtwarzając go, chyba że się mylę. można to zrobić za pomocą poniższej składni.
źródło
Spróbuj użyć
#
. Zwraca wszystkie instancje, które znajdują się w tabeli. Jeśli w tabeli nie ma instancji, zwraca0
źródło
#
to nie wystarczy i podaje powody; czy możesz wyjaśnić, dlaczego to omija te powody?