2009-11-18 2 views
73

나는 해시 맵, 즉 문자열 키를 사용하는 루아 테이블을 가지고있다.열쇠로 루아 표 항목을 제거하는 방법?

local map = { foo = 1, bar = 2 } 

키로 식별 된이 테이블의 요소를 "팝업"하고 싶다. table.remove() 메서드가 있지만 제거 할 요소의 인덱스 (즉 숫자) 만 사용하고 일반 키는 사용하지 않습니다. 나는 table.remove(map, 'foo')를 할 수 있고 싶다. 여기에 내가 어떻게 구현 했는가?

function table.removekey(table, key) 
    local element = table[key] 
    table[key] = nil 
    return element 
end 

더 좋은 방법이 있을까?

+4

+1 당신이 "대답"을 주었기 때문에 매우 유용한 질문입니다. 비록 "더 나은"방법이 없다고하더라도. –

답변

64

아니요, 키의 값을 nil으로 설정하면 테이블의 해시 맵 부분에서 항목을 제거하는 허용 된 방법입니다. 당신이하는 일은 표준입니다. 그러나 table.remove()을 재정의하지 않는 것이 좋습니다. 테이블의 배열 부분에 대해 기본 table.remove() 기능에는 재정의 할 인덱스의 번호를 다시 매는 기능이 포함됩니다. table 기능 세트에 기능을 추가하려면 table.removekey() 또는 그와 비슷한 이름을 지정해야합니다.

+0

삭제에 대한 의견을 보내 주셔서 감사합니다. 함수의 이름은 주로 내 요점을 분명히하기위한 것입니다. 나는 보통 표준 함수를 오버라이드하지 않는다. 나는 그 이름으로 사용하지 않을 것입니다 ('table.removekey()'도 최선의 선택입니다). – Wookai

+0

단일 블록 내에서만 사용하는 경우 성능 향상을 위해 대신 로컬 기능을 사용하는 것이 좋습니다 (각 호출에 대한 글로벌 조회 오버 헤드를 절약 할 수 있음). 나는 흔히'tinsert()'와'tremove()'와 같이 자주 사용하는 경우'table.insert'와'table.remove'를 로컬 네임 스페이스로 가져옵니다. – Amber

+0

성능 팁 주셔서 감사합니다. 필자가 자주 사용하는 함수를 로컬 네임 스페이스로 가져 와서 이것이 큰 차이가 나는지 알아 보도록하겠습니다. – Wookai

관련 문제