2016-04-25 15 views
3

誰かがこの明らかな狂気を説明できますか?Luaのテーブル長演算子はどのように機能しますか?

> t = {1, 2, 3} -- Table length 3. Simple 
> = #t 
3 -- Yep 

> t[3] = nil -- Remove the last element? 
> = #t 
2 -- Ok it realises it is the last one (since #t = 3) and decrements the length 

> t[6] = 6 -- Add a separate element? 
> = #t 
2 -- Ok... I guess? Although surely it knew #t = 2, and so now #t should be 6? 

> t[4] = 4 -- Add another separate element 
> = #t 
4 -- Errr... what. 

> t[5] = 5 -- Append another element 
> = #t 
6 -- Ok now it remembers element 6? Wtf? 

[OK]を、私は何

...再び

> t = {1, 2, 3} 
> = #t 
3 
> t[10] = 10 
> = #t 
3 
> t[4] = 4 
> = #t 
4 
> t[9] = 9 
> = #t 
4 
> t[8] = 8 
> = #t 
10 
を試してみましょう。

+0

ああ、それはそれを説明します。私は#tがnilを返すことができなかった理由や、未定義の場合-1を知りません。 – Timmmm

+0

あなたは、独自の '__len'メタメソッドを実装して、非シーケンステーブルに対して異なる結果を返すことができますが、テーブルが適切なシーケンスであるかどうかを特定する必要があります。 – Adam

答えて

5

テーブルの長さは、テーブルが適切なシーケンス(連続する整数キー)である場合にのみ定義されます。

ルアmanualは、長さ演算子を説明:

__lenメタメソッドが指定されない限りテーブルがシーケンスである場合、テーブルtの長さだけ、すなわち、その正の数値のセットを定義されていますいくつかの負でない整数nについては、{1..n} と等しくなります。その場合、nはその長さです。それはキー4を有しているが、鍵3 (したがって、集合{1..nのは}であるようにNが存在しないがないため

{10, 20, nil, 40} 

ようなテーブルは、配列ではないことに注意してくださいその表の正の数値キーの集合と同じです)。 ただし、非数値キーは表がシーケンスかどうかを妨げません。

関連する問題