2017-12-29 9 views
2

요소 추가시 크기를 자동으로 추적하는 메타 테이블을 사용하여 사용자 지정 테이블을 만들었습니다. 그것은 매우 잘 작동하고 # 연산자 또는 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? 
+0

@lhf 죄송합니다. 예제를 다시 타이핑 할 때 실수를했습니다. 내가 문제가있는 하하 존재하지 않는 변수를 참조하지 않는 내 질문을 업데이 트되었습니다. – Hatefiend

+0

루아 5.1에서는 프로그램이'1'이 아니라'0'을 출력합니다. –

+0

@EgorSkriptunoff 이상 하네. 이 예제에서는 [Lua 데모 사이트] (https://i.imgur.com/L8xrmmO.png)에서 통역사를 사용하고있었습니다. 왜 다른 결과를 인쇄합니까? [올바른 생각입니다] (https://i.imgur.com/FnAPt1E.png). 나는 왜 그런지 이해하지 못한다. – Hatefiend

답변

1

당신이 K, __newindex에서 V를 인쇄 할 경우 해당 K를 볼 수는 table.insert 어디 값을 삽입하는 방법 찾기 위해 테이블의 크기를 요구하기 때문입니다 항상 1입니다 . 기본적으로 마지막에 있습니다. __len 메타 메서드를 추가해야합니다. 그러나 아마도 이것은 당신의 목적을 (나에게 모호한) 패배시킬 것입니다.

+0

불행히도 저는 루아 5.1에 있고'__len' 또는'#'에 접근 할 수 없습니다. 다른 해결 방법이 있습니까? – Hatefiend

+0

사실, 테이블에 아무런 요소가 없다는 것을 알기 때문에 항상 '1'을 키로 생각하기 때문에 인덱스 '1'에 넣으려고합니다. 그러나 'public'프록시 테이블의 크기는 여전히 '1'이므로 '1'에 다시 삽입하려고합니까? 이것이 당신이 말하는 사이클입니까? – Hatefiend

관련 문제