Как удалить запись в таблице 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

Есть ли лучший способ сделать это?

Wookai
источник
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 Это не имеет отношения к части таблицы хэш-карты (строковые ключи).
Эмбер