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