公式ドキュメントはこのように説明しています#:長さ取得演算子は単項演算子 # と書きます。文字列の長さはそのバイト数です(つまり、1文字を1バイトとして計算した文字列の長さ)。
テーブル t の長さは、整数インデックス n として定義されます。それは t[n] が nil ではなく、t[n+1] が nil であることを満たします。さらに、t
local tblTest2 =
{
1,
a = 2,
3,
}
print(table.getn(tblTest2))
このコードの出力結果はいくつでしょうか?ここでの出力結果は次のようになるはずです:2。まず、理解すべきことは、このctblTest2cは単純なctableではなく、リスト(list)とレコード(record)の2つのスタイルが混在していることです。テーブルの中には、a = 2レコードスタイルです。次に理解すべきことは、レコードスタイルのレコードは、外側の長さとしては計算されないことです。それを関数のように考えることができます。他のオブジェクト指向言語と同じように、関数は内部変数としては記録されません。
関数のようなものですから、aの値を出力できます。そうです。print(tblTest2.a)それだけです。
次のコードを見てみましょう:
local tblTest3 =
{
1,
{a = 2},
3,
}
print(table.getn(tblTest3))
このコードの出力結果はいくつでしょうか?ここでの出力結果は次のようになるはずです:3。注意すべき点は、テーブルがテーブルをネストしている場合、ネストされたテーブルも要素であることです。したがって、出力結果は3。
table.getn(t)と等価です#t。
以下のケースは非常にややこしいので、最後の一文のまとめを直接見てください:
では、もう少しややこしいものを見てみましょう:
local tblTest4 =
{
1,
nil,
}
print(table.getn(tblTest4))
このコードの出力結果はいくつでしょうか?答えは1です。tableの長さを取得するとき、テーブル全体を走査し、最後の非nilの場所で返すことは誰もが知っています。
しかし、次のコードはどうでしょうか?
local tblTest5 =
{
1,
nil,
2,
}
print(table.getn(tblTest5))
出力は3です。面白いでしょう?nilも要素として長さに計算してしまいます。しかし、頭を悩ませるのが次のコードです:
local tblTest5 =
{
1,
nil,
2,
nil
}
出力は1。もう一つコードを見せましょう。あなたを完全に混乱させるでしょう:
local tblTest5 =
{
1,
nil,
2,
nil,
3,
nil
}
出力は3。混乱しましたか?さらに見てください。このコードは、今後二度とtableにnil値を書こうとは思わせないでしょう:
local tblTest5 =
{
1,
nil,
2,
nil,
3,
nil,
4,
nil
}
見てください。このコードの出力結果は1です。皆さん、今後もluaのtableでnil値を使う勇気がありますか???もしnilを後ろに追加し続けると、何かに気づくかもしれません。あなたはそれが規則を発見したと思うかもしれません。しかし、それを規則だと思ってはいけません。なぜならそれは間違いだからです。
- 1、table内でnilを使用しないこと
- 2、どうしてもnilを使用する必要がある場合は、table.setn()関数を使用してそのテーブルの長さを設定しなければなりません。注意:新しいバージョンのluaはsetnをサポートしていません。
必ず結論を述べさせてください:setn関数は時代遅れです。luaのtableでnil値を使用しないでください。要素を削除したい場合は、直接removeを使用し、nilで代用しないでください。
出典:http://www.cnblogs.com/youxin/p/3799339.html