LUA 테이블이 비어 있는지 확인하는 가장 효율적인 방법 (항목이 포함되어 있음)?

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

  •  12-09-2019
  •  | 
  •  

문제

테이블이 비어 있는지 확인하는 가장 효율적인 방법은 무엇입니까 (즉, 배열 스타일 값이나 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(...) ...

다른 팁

중식 가능한 "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

나는 이것이 오래된 것을 알고 있으며, 어떻게 든 당신을 오해 할 수 있지만, 당신은 단지 테이블이 비어 있기를 원합니다. 내가 착각하지 않는 한 간단히 재현하여 그것을 지울 수 있습니다. 아래 구문으로 수행 할 수 있습니다.

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