web-dev-qa-db-ja.com

Luaテーブルが空(エントリを含まない)かどうかを判断する最も効率的な方法は?

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

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

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

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

注:#演算子は、テーブル内の配列スタイルの値に対してのみ動作するため、ここでは十分ではありません。したがって、#{test=2}は、両方が0を返すため、#{}と区別できません。テーブル変数がnilであるかどうかをチェックしても、nil値を探しているのではなく、0エントリ(つまり{})のテーブルを探しているので十分ではありません。

112
Amber

コードは効率的ですが、間違っています。 (検討{[false]=0}。)正しいコードは

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

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

...
local next = next 
...
... if next(...) ...
136
Norman Ramsey

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

空のテーブルのテストでは、カウンターを0でテストします。

ここに metatable documentation へのポインタがあります

私はあなたのソリューションが好きですが、正直に言って、私のソリューションが全体的に速いとは思いません。

1
0x6adb015

これはどう ?

if endmyTable[1] == nil then
  -- myTable is empty
end
0
Venkat Reddy

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

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
0
FichteFoll