LUA 테이블이 비어 있는지 확인하는 가장 효율적인 방법 (항목이 포함되어 있음)?
문제
테이블이 비어 있는지 확인하는 가장 효율적인 방법은 무엇입니까 (즉, 배열 스타일 값이나 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