テーブルが空かどうか (つまり、現在配列形式の値も辞書形式の値も含まれていないかどうか) を判断する最も効率的な方法は何ですか?
現在、私は以下を使用していますnext()
:
if not next(myTable) then
-- Table is empty
end
もっと効率的な方法はありますか?
注:#
演算子は、テーブル内の配列形式の値に対してのみ機能するため、ここでは十分ではありません。したがって、両方とも 0 を返すため#{test=2}
、 と区別できません。#{}
また、テーブル変数が であるかどうかを確認するだけでは不十分であることにも注意してください。これは、nil 値ではなく、エントリが 0 のテーブル (つまり)nil
を探しているためです。{}
ベストアンサー1
あなたのコードは効率的ですが間違っています。(考慮してください{[false]=0}
。)正しいコードは次のとおりです。
if next(myTable) == nil then
-- myTable is empty
end
next
効率を最大限に高めるには、ローカル変数にバインドする必要があります。例:
...
local next = next
...
... if next(...) ...
(next
がローカルの場合、コードはnext
「上位値」の配列への定数時間のインデックス操作によってプリミティブ関数を検索します。がnext
グローバルのままの場合、検索には、next
グローバル変数の値を含む「環境」ハッシュ テーブルのインデックス作成が含まれます。このインデックス作成操作は定数時間ですが、ローカル変数の配列検索よりも大幅に遅くなります。)