program tip

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

radiobox 2020. 7. 29. 08:06
반응형

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


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

현재 저는 다음을 사용하고 있습니다 next():

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

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

참고 : #연산자는 테이블의 배열 스타일 값에서만 작동하므로 충분하지 않습니다. 따라서 둘 다 0을 반환하므로 #{test=2}구별 할 수 없습니다. #{}또한 테이블 변수가 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

참고 URL : https://stackoverflow.com/questions/1252539/most-efficient-way-to-determine-if-a-lua-table-is-empty-contains-no-entries

반응형