Вопрос

Я не могу получить индекс записи в таблице.Мне это нужно, чтобы удалить элемент из таблицы.

Я использую table.insert чтобы добавить записи в таблицу.

Еще один вопрос:почему Lua не имеет "перегрузки" для функции table.remove, чтобы можно было удалить элемент по ассоциативному индексу?

Это было полезно?

Решение

t[k]=nil удаляет из t вход с ключом k.

На второй вопрос ответ заключается в том, что таблицы могут иметь отдельные метатаблицы.

Другие советы

Таблицы реализуют неупорядоченное отношение "один ко многим" между ключами и значениями.Другими словами, любой конкретный ключ (индекс) может появиться в таблице только один раз, но значение может появиться несколько раз.

Если вы знаете ключ k, тогда t[k] = nil удалит как ключ, так и связанное с ним значение из таблицы.Однако эта операция никак не влияет на какие-либо другие ключи или значения в таблице.

Тот Самый table.insert и table.remove функции оперируют набором последовательных целочисленных ключей, начинающихся с 1, которые по соглашению используются для реализации массивов или списков.С этой целью они манипулируют другими значениями в списке, чтобы не допустить появления дыр в списке.

Один из способов найти ключ, по которому найдено какое-то значение, - это просто выполнить поиск по таблице.Если это будет сделано более одного раза, то, вероятно, хорошей идеей будет создать вторую таблицу, которая инвертирует пары ключ / значение, чтобы поиск по значению выполнялся так же быстро, как поиск по индексу.

Подходящая реализация будет зависеть от ваших предположений и потребностей.Вот некоторые образцы:

-- return the first integer index holding the value 
function AnIndexOf(t,val)
    for k,v in ipairs(t) do 
        if v == val then return k end
    end
end

-- return any key holding the value 
function AKeyOf(t,val)
    for k,v in pairs(t) do 
        if v == val then return k end
    end
end

-- return all keys holding the value
function AllKeysOf(t,val)
    local s={}
    for k,v in pairs(t) do 
        if v == val then s[#s+1] = k end
    end
    return s
end

-- invert a table so that each value is the key holding one key to that value 
-- in the original table.
function Invert(t)
    local i={}
    for k,v in pairs(t) do 
        i[v] = k
    end
    return i
end
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top