公式ドキュメントはこのように説明しています#:長さ取得演算子は単項演算子 # と書きます。文字列の長さはそのバイト数です(つまり、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