2012-03-08 12 views
9

私はCアプリケーションにLuaのを埋め込んだ、とテーブルを介して、私のCコードで作成された理由を把握しようとしています:Lua table.getn()は0を返しますか?

lua_createtable(L, 0, numObjects); 

とLuaのに戻って、私が呼び出したときにゼロの結果を生成します次のペア:

print("Num entries", table.getn(data)) 

私は、各エントリ(ユーザデータの文字列)を介して歩くことができるように、データテーブルは、はっきりであります(ここで、「データ」は、上記lua_createtableにより作成されたテーブルです)経由で:

for key, val in pairs(data) do 
    ... 
end 

しかし、なぜtable.getn(data)はゼロを返しますか? lua_createtableでテーブルを作成するときに、テーブルのメタに何かを挿入する必要がありますか?私はlua_createtableの使用例を見てきましたが、これはどこでも実行されていませんでした....

答えて

23

table.getnを何もカウントされません。使用します長さ演算子#)は、表の配列の要素の数を返します。

配列部分は、番号1で始まり、最初の値がnil(存在しない)まで増加するすべてのキーです。すべてのキーが文字列の場合、テーブルの配列部分のサイズは0です。

+0

私がやろうとしていることを簡単に行う方法はありませんか? - 私はそれを直接反復せずに持っているテーブル内の要素の数(読み取りペア)を取得する? – jimt

+1

テーブルに何かを変更し、演算子がその値を返すように '__len'メタメソッドをオーバーロードすると、テーブルサイズを手動で追跡できます。もちろん、このアプローチでは、多くのコーディング規律が必要です。テーブルサイズの値を更新するのを忘れてしまい、あなたが悩んでしまいます。 – ComicSansMS

+3

「長さ演算子を使用する」と言うのは失礼ですが、例は言及していません。この答えが言っていることは、「配列Aの長さを得るには、#Aと入力してください。それは些細なように見えるかもしれませんが、テストして快適になるまでオペレータがあなたが思うように行動するとは想定できないので、多くの人々を捨てて疑いが生じます。それにもかかわらず。 – Dmitry

2

#演算子(とtable.getn)は効果的に配列セクションのサイズを返しますセマンティクスが複雑であるホーリーテーブル)

それはあなたがLuaの5.1+で使用すべきでない(表のハッシュ部分(例えば、文字列キー)で

3

単純なリストの場合はコストがかかりますが(O(n)とO(1))、メソッドを追加することもできますあなたは、このような要件がある場合は

>> function table.map_length(t) 
    local c = 0 
    for k,v in pairs(t) do 
     c = c+1 
    end 
    return c 
end 

>> a = {spam="data1",egg='data2'} 
>> table.map_length(a) 
2 

、およびお使いの環境では、あなたがそうthat kind of featuresとはるかに提供penlightを使用して考えることを可能にする場合:あなたのマップの要素をカウントします。

0
for k,v in pairs(tbl) do count = count + 1 end 
関連する問題