Как удалить запись в таблице lua по ее ключу?


97

У меня есть таблица 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 к очень полезному вопросу, потому что вы дали нужный мне «ответ»; даже если нет "лучшего" способа.
— Ian Boyd

Ответы:


84

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


Спасибо за отзыв об удалении. Что касается названия функции, это было сделано главным образом для того, чтобы прояснить мою точку зрения. Обычно я не отменяю стандартные функции. Я определенно не буду использовать его под этим именем (это table.removekey()тоже мой лучший выбор).
— Wookai

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

Спасибо за совет по производительности. Я попытаюсь импортировать функции, которые я часто использую, в локальное пространство имен, чтобы увидеть, имеет ли это большое значение.
— Wookai

Обратите внимание, что вы должны использовать table.remove (indez, position) вместо того, чтобы устанавливать для него значение nil, чтобы индексы были уменьшены и, следовательно, элементы переместились.

@HakanBoztepe Это не имеет отношения к части таблицы хэш-карты (строковые ключи).
— Эмбер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.