効率的な方法を決定する方法にユーザテーブルが空である(含まない作品?

StackOverflow https://stackoverflow.com/questions/1252539

  •  12-09-2019
  •  | 
  •  

質問

何のために効率的な方法を決定した場合には空では、現在、どちらも含まない配列-スタイル値も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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top