137

テーブルが空であるかどうか(つまり、現在、配列スタイルの値もdictスタイルの値も含まれていないか)を判断する最も効率的な方法は何ですか?

現在、私は使用していnext()ます:

if not next(myTable) then
    -- Table is empty
end

より効率的な方法はありますか?

注:#演算子はテーブル内の配列スタイルの値のみを操作するため、ここでは不十分です。どちらも0を返すため、#{test=2}区別できません#{}。また、テーブル変数がであるかどうかを確認するだけでnilは不十分であることに注意してください。 nil値ですが、エントリが0のテーブル(つまり{})。

4

8 に答える 8

183

あなたのコードは効率的ですが間違っています。(検討してください{[false]=0}。)正しいコードは

if next(myTable) == nil then
   -- myTable is empty
end

next効率を最大にするには、ローカル変数にバインドする必要があります。

...
local next = next 
...
... if next(...) ...

nextがローカルの場合、コードはnext定数時間のインデックス付け操作によって「アップバリュー」の配列へのプリミティブ関数を検索します。nextグローバルのままの場合、検索nextには、グローバル変数の値を含む「環境」ハッシュテーブルのインデックス作成が含まれます。このインデックス作成操作は依然として定数時間ですが、ローカル変数の配列ルックアップよりも大幅に遅くなります。)

于 2009-08-10T01:14:35.293 に答える
2

過負荷の場合は__eqの評価を避ける方がよいでしょう。

if rawequal(next(myTable), nil) then
   -- myTable is empty
end

また

if type(next(myTable)) == "nil" then
   -- myTable is empty
end
于 2018-12-03T17:43:43.573 に答える
1

1つの可能性は、メタテーブルの「newindex」キーを使用して、要素の数をカウントすることです。何かを割り当てない場合nilは、カウンターをインクリメントし(カウンターはメタテーブル内に存在する可能性もあります)、割り当てる場合nilは、カウンターをデクリメントします。

空のテーブルのテストは、0でカウンターをテストすることです。

メタテーブルドキュメントへのポインタは次のとおりです

私はあなたの解決策が好きです、そして私は正直に言って私の解決策が全体的に速いとは思いません。

于 2009-08-10T01:12:13.223 に答える
0

これはおそらくあなたが望んでいたことです:

function table.empty (self)
    for _, _ in pairs(self) do
        return false
    end
    return true
end

a = { }
print(table.empty(a))
a["hi"] = 2
print(table.empty(a))
a["hi"] = nil
print(table.empty(a))

出力:

true
false
true
于 2012-04-11T22:34:55.737 に答える
-1

蛇を試して、私のために働いてください

serpent = require 'serpent'

function vtext(value)
  return serpent.block(value, {comment=false})
end

myTable = {}

if type(myTable) == 'table' and vtext(myTable) == '{}' then
   -- myTable is empty
end
于 2019-05-18T19:29:52.400 に答える
-3

これは古いことを知っているので、どういうわけかあなたを誤解している可能性がありますが、テーブルを空にしたいだけです。つまり、テーブルが空であるかどうかを確認しているだけで、実際に空にする必要がない場合を除きます。私が間違えない限り、あなたはそれを単に再作成することによってそれをクリアすることができます。これは、以下の構文で実行できます。

yourtablename = {} -- this seems to work for me when I need to clear a table.
于 2016-05-04T12:31:59.803 に答える
-3

これはどう ?

if endmyTable[1] == nil then
  -- myTable is empty
end
于 2019-05-31T19:53:04.927 に答える
-7

を使用してみてください#。テーブルにあるすべてのインスタンスを返します。テーブルにインスタンスがない場合は、次のようになります。0

if #myTable==0 then
print('There is no instance in this table')
end
于 2017-01-04T02:03:08.930 に答える