Sehen wir uns zunächst den Quellcode zum Ermitteln der Länge einer Lua-Tabelle an (ltable.c)
j ist die Länge des Array-Teils. Wenn zunächst die Array-Länge größer als 0 ist und das letzte Element des Arrays nil ist, verwenden Sie die binäre Suche, um die Länge zu finden und zurückzugeben.
Wenn t->node den Hash-Teil der Tabelle speichert und wenn er leer ist, geben Sie die Länge des Arrays zurück.
Erstes Beispiel:
In diesem Fall wird die Array-Länge initialisiert, und die Länge von t ist 7. Warum? Weil das letzte Element nicht nil ist.
Im folgenden Fall ist die Länge von t 5.
Zweites Beispiel:
Jeder sollte wissen, dass die Länge von t 5 ist.
In diesem Fall, was ist die Länge von t???
Die Antwort ist 2. Warum?
Das Einfügen von t
t
Dann wird es in (lvm.c) eintreten
Dann ruft es die Funktion luaH_newkey in (ltable.c) auf
Dann ruft es rehash auf
Dieser Teil ist tatsächlich die Berechnung des Array-Teils und dessen, was in den Hash-Teil kommt. nums ist die Verteilung der Statistiken. Wenn Sie den Code sorgfältig ansehen, werden Sie erkennen, dass die Array-Länge 2 hoch n ist.
Hier ist nil keine Zahl und wird nicht in die Statistik einbezogen, daher wird für 1, 2, 5 und 6 die Array-Länge als 4 berechnet, und der Rest wird in den Node-Teil gesetzt.
Eine Tabelle setzt sich aus einem Array und einem Node-Hash-Teil zusammen.
Somit ist gemäß der Funktion, die wir uns zuvor angesehen haben, das vierte Element nil, also ist die mit binärer Suche ermittelte Länge 2.
Dies ist ein Fallstrick, der entstehen kann, wenn sich nil in einem Lua-Array befindet. Natürlich wird er nur durch rehash verursacht.
Originaladresse: https://www.cnblogs.com/wallini/p/4188499.html