Làm thế nào để loại bỏ một mục nhập bảng lua bằng khóa của nó?


94

Tôi có một bảng lua mà tôi sử dụng làm bản đồ băm, tức là với các khóa chuỗi:

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

Tôi muốn "bật" một phần tử của bảng này được xác định bằng khóa của nó. Có một table.remove()phương thức, nhưng nó chỉ lấy chỉ mục của phần tử cần loại bỏ (tức là một số) chứ không phải khóa chung. Tôi muốn có thể làm được table.remove(map, 'foo')và đây là cách tôi triển khai nó:

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

Có cách nào tốt hơn để làm điều đó không?


4
+1 cho câu hỏi rất hữu ích vì bạn đã đưa ra "câu trả lời" mà tôi cần; ngay cả khi không có cách nào "tốt hơn".
Ian Boyd

Câu trả lời:


82

Không, đặt giá trị của khóa thành nillà cách được chấp nhận để xóa một mục trong phần bản đồ băm của bảng. Những gì bạn đang làm là tiêu chuẩn. Tuy nhiên, tôi khuyên bạn không nên ghi đè table.remove()- đối với phần mảng của bảng, chức năng table.remove () mặc định bao gồm việc đánh số lại các chỉ mục, điều mà bạn sẽ không ghi đè. Nếu bạn muốn thêm chức năng của mình vào tabletập hợp chức năng, thì tôi có thể đặt tên cho nó một cái gì đó tương tự như table.removekey()vậy.


Cảm ơn đã phản hồi về việc xóa. Về tên của hàm, điều này chủ yếu là để làm rõ quan điểm của tôi. Tôi thường không ghi đè các chức năng tiêu chuẩn. Tôi chắc chắn sẽ không sử dụng nó dưới cái tên đó ( table.removekey()cũng sẽ là lựa chọn tốt nhất của tôi).
Wookai

1
Nếu bạn chỉ sử dụng nó trong một khối duy nhất, bạn thậm chí còn có hiệu suất tốt hơn bằng cách đơn giản biến nó thành một hàm cục bộ thay thế (tiết kiệm chi phí tra cứu toàn cục cho mỗi cuộc gọi). Tôi khá thường xuyên nhập table.inserttable.removevào không gian tên cục bộ nếu tôi đang sử dụng chúng thường xuyên, thường là những thứ như tinsert()tremove().
Amber

Cảm ơn vì mẹo hiệu suất. Tôi sẽ cố gắng nhập các chức năng tôi thường sử dụng vào không gian tên cục bộ để xem điều này có tạo ra sự khác biệt lớn hay không.
Wookai

Lưu ý rằng bạn nên sử dụng table.remove (indz, position) thay vì đặt nó thành nil vì vậy các chỉ mục sẽ bị giảm và do đó các phần tử được định vị lại.

@HakanBoztepe Điều đó không liên quan đến phần bản đồ băm của bảng (các phím chuỗi).
Amber
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.