[lua] Lua 테이블이 비어 있는지 (항목을 포함하지 않음) 확인하는 가장 효율적인 방법은 무엇입니까?

테이블이 비어 있는지 확인하는 가장 효율적인 방법은 무엇입니까 (즉, 현재 배열 스타일 값도 dict 스타일 값도 포함하지 않음)?

현재 사용하고 있습니다 next().

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

더 효율적인 방법이 있습니까?

참고 : #연산자는 테이블의 배열 스타일 값에서만 작동하므로 여기에서 충분하지 않습니다. 따라서 둘 다 0을 반환하기 때문에 #{test=2}구분할 수 없습니다. #{}또한 테이블 변수가 있는지 확인하는 nil것으로는 충분하지 않습니다. nil 값이 아니라 항목이 0 인 테이블 (예 🙂 {}.



답변

코드는 효율적이지만 잘못되었습니다. (고려하십시오 {[false]=0}.) 올바른 코드는

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

최대 효율성 next을 위해 로컬 변수 에 바인딩하고 싶을 것입니다 .

...
local next = next
...
... if next(...) ...


답변

한 가지 가능성은 메타 테이블 “newindex”키를 사용하여 요소 수를 계산하는 것입니다. 아닌 것을 할당 할 때는 nil카운터를 늘리고 (카운터는 메타 테이블에도있을 수 있음) 할당 할 때는 nil카운터를 줄입니다.

빈 테이블에 대한 테스트는 카운터를 0으로 테스트하는 것입니다.

다음은 메타 테이블 문서에 대한 포인터입니다.

나는 당신의 솔루션을 좋아하고 솔직히 내 솔루션이 전반적으로 더 빠르다고 생각할 수 없습니다.


답변

이것은 아마도 당신이 원했던 것입니다.

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


답변

오버로드 된 경우 __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


답변

나는 이것이 오래되었다는 것을 알고 있으며 어떻게 든 당신을 오해 할 수 있지만 테이블이 비어 있기를 원합니다. 즉, 그것이 있는지 확인하고 실제로 비워두기를 원하지 않거나 필요로하지 않는 한, 내가 착각하지 않는 한 간단히 다시 생성하여 지울 수 있습니다. 이것은 아래 구문으로 수행 할 수 있습니다.

yourtablename = {} -- this seems to work for me when I need to clear a table.