¿Cómo eliminar una entrada de tabla lua por su clave?

95

Tengo una tabla lua que uso como hashmap, es decir, con claves de cadena:

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

Me gustaría "hacer estallar" un elemento de esta tabla identificado por su clave. Hay un table.remove()método, pero solo se necesita el índice del elemento a eliminar (es decir, un número) y no una clave genérica. Me gustaría poder hacerlo table.remove(map, 'foo')y así es como lo implementé:

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

¿Existe una mejor manera de hacerlo?

Wookai
fuente
4
+1 a la pregunta muy útil porque diste la "respuesta" que necesitaba; incluso si no hay una forma "mejor".
Ian Boyd

Respuestas:

83

No, establecer el valor de la clave en niles la forma aceptada de eliminar un elemento en la parte del mapa de hash de una tabla. Lo que estás haciendo es estándar. Sin embargo, recomendaría no anular table.remove(): para la parte de matriz de una tabla, la funcionalidad predeterminada table.remove () incluye volver a numerar los índices, lo que su anulación no haría. Si desea agregar su función al tableconjunto de funciones, entonces probablemente lo nombraría algo como table.removekey()o algo así.

Ámbar
fuente
Gracias por los comentarios sobre la eliminación. Sobre el nombre de la función, esto fue principalmente para aclarar mi punto. Por lo general, no anulo las funciones estándar. Definitivamente no lo usaré con ese nombre (también table.removekey()sería mi mejor opción).
Wookai
1
Si solo lo está usando dentro de un solo bloque, estará aún mejor en cuanto al rendimiento simplemente convirtiéndolo en una función local (ahorra la sobrecarga de una búsqueda global para cada llamada). A menudo los importo table.inserty table.removeal espacio de nombres local si los uso con frecuencia, a menudo como algo como tinsert()y tremove().
Ámbar
Gracias por el consejo de rendimiento. Intentaré importar las funciones que utilizo a menudo en el espacio de nombres local para ver si esto hace una gran diferencia.
Wookai
Tenga en cuenta que debe usar table.remove (indez, position) en lugar de establecerlo en nil para que los índices disminuyan y, por lo tanto, los elementos se reposicionen.
@HakanBoztepe Eso no es relevante para la porción de mapa hash de la tabla (claves de cadena).
Ámbar