2016-07-30 11 views
0

Ich bin neu in Lua und meine Lua-Version ist 5.1.
Ich habe dieses Problem. Kann mir jemand helfen, # zu erklären?Wie bekommt man die Länge eines Tisches in Lua?

local tblTest = 
{ 
    [1] = 2, 
    [2] = 5, 
    [5] = 10, 
} 
print(#tblTest) 

dieser Ausgang 2 und ..

local tblTest = 
{ 
    [1] = 2, 
    [2] = 5, 
    [4] = 10, 
} 
print(#tblTest) 

Ausgang 4. Warum?
danke alle von Ihnen.

Antwort

2

Der Ausgang ist 4, weil der letzte Schlüssel mit einem Wert 4 ist, aber das bedeutet nicht, dass 3 nicht auch definiert ist. In Lua würde 3 als Null definiert werden. Wenn Sie also den Operator verwenden, zählt er jeden Schlüssel in einer Sequenz mit einem Wert bis zum letzten Nicht-Null-Wert. Außer, (und ich könnte mich irren) ist der letzte Schlüssel in der Tabelle eine Potenz von 2, was zur Sprachoptimierung führt, sie zählt bis zu dem Wert, der eine Potenz von 2 ist. Im Allgemeinen sollten Sie sich von Tabellen fernhalten mit Null-Werten, da es einige andere seltsame Verhaltensweisen gibt, die deswegen auftreten.

Dieser Brocken mit tun, was Sie wollen, obwohl:

local T = { 
[1] = 2, 
[2] = 5, 
[10] = 10 
} 

local lengthNum = 0 

For k, v in pairs(T) do -- for every key in the table with a corresponding non-nil value 
    lengthNum = lengthNum + 1 
end 
print(lengthNum) 
} 

Was dies tut, ist es für Schlüssel (wie [1] oder [2]) und prüft die gesamte Tabelle überprüft, ob sie Wert. Jeder Schlüssel mit einem Nicht-Null-Wert führt die Schleife for noch einmal durch. Es könnte einen kürzeren Weg dazu geben, aber so würde ich es machen.

+0

Ja, Sie sind tödlich falsch. Sieh den Betrogenen. – Deduplicator

+0

Ist es, wo ich gesagt habe, dass es bis zu dem Wert mit der Potenz von 2 zählt, weil es Schlüssel für Wert dort sagen sollte, oder bin ich sonst wo falsch? – Jacques

+0

Es * kann * trotz früherer Löcher bis zu einer Potenz von 2 zählen, obwohl es nicht möglich ist. Keine Garantie, die Details sind in der Täuschung. – Deduplicator

Verwandte Themen