テーブルが空(つまり、現在、配列スタイルの値もdictスタイルの値も含まれていない)かどうかを判断する最も効率的な方法は何ですか?
現在、私はnext()
を使用しています:
if not next(myTable) then
-- Table is empty
end
より効率的な方法はありますか?
注:#
演算子は、テーブル内の配列スタイルの値に対してのみ動作するため、ここでは十分ではありません。したがって、#{test=2}
は、両方が0を返すため、#{}
と区別できません。テーブル変数がnil
であるかどうかをチェックしても、nil値を探しているのではなく、0エントリ(つまり{}
)のテーブルを探しているので十分ではありません。
コードは効率的ですが、間違っています。 (検討{[false]=0}
。)正しいコードは
if next(myTable) == nil then
-- myTable is empty
end
最大の効率を得るには、next
をローカル変数にバインドする必要があります。たとえば、
...
local next = next
...
... if next(...) ...
1つの可能性は、メタテーブルの「newindex」キーを使用して、要素の数をカウントすることです。 nil
以外の何かを割り当てる場合は、カウンターをインクリメントし(カウンターはメタテーブルにも存在します)、nil
を割り当てる場合は、カウンターをデクリメントします。
空のテーブルのテストでは、カウンターを0でテストします。
ここに metatable documentation へのポインタがあります
私はあなたのソリューションが好きですが、正直に言って、私のソリューションが全体的に速いとは思いません。
これはどう ?
if endmyTable[1] == nil then
-- myTable is empty
end
これはおそらくあなたが望んでいたものです:
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