効率的な方法を決定する方法にユーザテーブルが空である(含まない作品?
質問
何のために効率的な方法を決定した場合には空では、現在、どちらも含まない配列-スタイル値もdict-スタイル値)?
現在、私が使っている next()
:
if not next(myTable) then
-- Table is empty
end
がより効率的な方法は何でしょうか?
注意:の #
オペレーターだけでは不十分で、ここでのみ動作し、配列型の値を表し #{test=2}
変わら #{}
そこには0を返す.また、チェックの場合はテーブル変数 nil
なるだけでは十分ではないとしていな空値ではなくテーブル0件( {}
).
解決
あなたのコードでは、効率的ではなく間違っています。 ({[false]=0}
を考える。)正しいコードは
if next(myTable) == nil then
-- myTable is empty
end
効率を最大にするには、ローカル変数にnext
をバインドすることをお勧めします、例えば、
...
local next = next
...
... if next(...) ...
他のヒント
可能性の一つがカウントの要素数を用metatable"をnewindexに移動"。割り当てる際になかった nil
,追加モードの場合は、ファインカウンタのカウンターが、出張不在の為、しばらのmetatableとが好きな方にはもちろん、合格 nil
,減分します。
試験のための空のテーブルがテストのカウンターを0になります。
ここでのポインタを metatable書
いソリューションが、正直でないものは早います。
これは、あなたが何を望むか、おそらく次のとおりです。
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
私は、これは古いです知っている、と私は何とかあなたを誤解することができますが、それは、あなたが実際にそれをしたいか、必要としない場合は、あなただけチェックされていない限り、それはあなただけ、つまり、テーブルが空になりたいです私は誤解だ場合を除き空にして、あなたは、単にそれを再作成することによって、それをクリアすることができます。これは、以下の構文で行うことができます。
yourtablename = {} -- this seems to work for me when I need to clear a table.
オーバーロードされた場合__eqの評価を避けるために、より良います。
if rawequal(next(myTable), nil) then
-- myTable is empty
end
または
if type(next(myTable)) == "nil" then
-- myTable is empty
end
、蛇をしようと私のための作業
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
これはどう?
if endmyTable[1] == nil then
-- myTable is empty
end
#
を使用してみてください。これは、テーブルにあるすべてのインスタンスを返します。テーブル内のインスタンスがない場合、それは0
を返します。
if #myTable==0 then
print('There is no instance in this table')
end