Як видалити запис таблиці lua за його ключем?


94

У мене є таблиця lua, яку я використовую як хеш-карту, тобто за допомогою рядкових ключів:

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 до дуже корисного запитання, тому що ви дали мені потрібну "відповідь"; навіть якщо немає "кращого" шляху.
Ян Бойд

Відповіді:


82

Ні, встановлення значення ключа nil- це прийнятний спосіб видалення елемента в частині хеш-карти таблиці. Те, що ви робите, є стандартним. Однак я б рекомендував не перевизначати table.remove()- для масивної частини таблиці функція за замовчуванням table.remove () включає перенумерування індексів, чого ваша перевизначення не зробила б. Якщо ви все-таки хочете додати свою функцію до tableнабору функцій, тоді я, мабуть, назвав би це як-небудь table.removekey()або щось подібне.


Дякуємо за відгук про видалення. Щодо назви функції, це головним чином для пояснення моєї думки. Зазвичай я не замінюю стандартні функції. Я точно не буду використовувати його під такою назвою ( table.removekey()теж мій найкращий вибір).
Вукай

1
Якщо ви використовуєте його лише в межах одного блоку, вам буде навіть краще з точки зору продуктивності, просто зробивши замість цього локальну функцію (зберігає накладні витрати на загальний пошук для кожного виклику). Я досить часто імпортувати table.insertі table.removeв локальний простір імен , якщо я їх допомогою часто, часто , як - то начебто tinsert()і tremove().
Ембер

Дякуємо за підказку щодо ефективності. Я спробую імпортувати функції, які я часто використовую, у локальний простір імен, щоб перевірити, чи це сильно впливає.
Вукай

Зверніть увагу, що вам слід використовувати table.remove (indez, position), замість того, щоб встановлювати його на нуль, щоб індекси зменшувались, а отже, елементи переставлялися.

@HakanBoztepe Це не має значення для частини хеш-карти таблиці (рядкові ключі).
Бурштин
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.