요소 추가시 크기를 자동으로 추적하는 메타 테이블을 사용하여 사용자 지정 테이블을 만들었습니다. 그것은 매우 잘 작동하고 #
연산자 또는 getn
함수에 대한 필요성을 제거합니다.table.insert가 __index를 트리거하지 않습니까?
그러나 문제가 있습니다. table.insert
을 호출하면 함수는 __index
또는 __newindex
을 호출하지 않습니다. 따라서, 내 테이블은 요소가 이런 식으로 제거 될 때 알 수 없습니다. 문제가 table.remove
과 동일하다고 가정합니다.
- 캡처
insert
의 이벤트 내 자신의 기능을 사용할 수는insert
가 내 테이블에 불려 갔을 경우 너무 - 이 오류가 발생 할 : I 중 하나를 어떻게
.
감사
function Table_new()
local public = { }
local tbl = { }
local size = 0
function public.size()
return size
end
return setmetatable(public, {
__newindex = function(t, k, v)
local previous_v = tbl[k]
rawset(tbl, k, v)
if previous_v ~= nil then
if v == nil then
size = size - 1
end
elseif v ~= nil then
size = size + 1
end
end,
__index = tbl
})
end
local t = Table_new()
t[5] = "hi"
t[17] = "hello"
t[2] = "yo"
t[17] = nil
print(t.size()) -- prints 2
local z = Table_new()
table.insert(z, "hey")
table.insert(z, "hello")
table.insert(z, "yo")
print(z.size()) -- prints 1 -- why?
@lhf 죄송합니다. 예제를 다시 타이핑 할 때 실수를했습니다. 내가 문제가있는 하하 존재하지 않는 변수를 참조하지 않는 내 질문을 업데이 트되었습니다. – Hatefiend
루아 5.1에서는 프로그램이'1'이 아니라'0'을 출력합니다. –
@EgorSkriptunoff 이상 하네. 이 예제에서는 [Lua 데모 사이트] (https://i.imgur.com/L8xrmmO.png)에서 통역사를 사용하고있었습니다. 왜 다른 결과를 인쇄합니까? [올바른 생각입니다] (https://i.imgur.com/FnAPt1E.png). 나는 왜 그런지 이해하지 못한다. – Hatefiend