키로 루아 테이블 항목을 제거하는 방법은 무엇입니까?


94

해시 맵, 즉 문자열 키로 사용하는 루아 테이블이 있습니다.

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하십시오. "더 나은"방법이 없더라도.
Ian Boyd

답변:


82

아니요, 키 값을로 설정하는 nil것은 테이블의 해시 맵 부분에서 항목을 제거하는 데 허용되는 방법입니다. 당신이하는 일은 표준입니다. 그러나 재정의하지 않는 것이 좋습니다 table.remove(). 테이블의 배열 부분의 경우 기본 table.remove () 기능에는 재정의가 수행하지 않는 인덱스 번호 재 지정이 포함됩니다. table함수 세트에 함수를 추가하고 싶다면 아마 비슷한 이름을 붙일 것입니다 table.removekey().


삭제에 대한 의견을 보내 주셔서 감사합니다. 기능의 이름에 관해서는, 이것은 주로 내 요점을 명확하게하기위한 것이 었습니다. 나는 일반적으로 표준 기능을 재정의하지 않습니다. 나는 그 이름으로 그것을 사용하지 않을 table.removekey()것입니다 (또한 최선의 선택이 될 것입니다).
Wookai

1
단일 블록 내에서만 사용하는 경우 대신 단순히 로컬 함수로 만들어 성능면에서 더 좋습니다 (각 호출에 대한 전역 조회의 오버 헤드 절약). 나는 꽤 자주 가져 오기 table.inserttable.remove로컬 네임 스페이스에 나는 종종 같은 것을 같이 자주 사용하고있는 경우 tinsert()tremove().
Amber

성능 팁에 감사드립니다. 자주 사용하는 함수를 로컬 네임 스페이스로 가져 와서 이것이 큰 차이가 있는지 확인하려고합니다.
Wookai

nil로 설정하는 대신 table.remove (indez, position)을 사용해야 인덱스가 감소하여 요소의 위치가 변경됩니다.

@HakanBoztepe 테이블의 해시 맵 부분 (문자열 키)과 관련이 없습니다.
Amber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.