Существует ли метод для проверки, если таблица содержит значение? У меня есть своя собственная (наивная) функция, но я задавался вопросом, существует ли что-то "официальное" для этого? Или что-то более эффективное...
function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end
Между прочим, главная причина, я использую это, функционирует, должен использовать таблицы в качестве наборов, т.е. без дублирующихся элементов. Есть ли что-то еще, что я мог использовать?
Вы можете поместить значения в качестве ключей таблицы. Например:
function addToSet(set, key)
set[key] = true
end
function removeFromSet(set, key)
set[key] = nil
end
function setContains(set, key)
return set[key] ~= nil
end
Есть более полнофункциональный пример здесь.
Я не могу придумать другого способа сравнения значений, но если вы используете элемент множества в качестве ключа, вы можете установить значение на что угодно, кроме nil. Тогда вы получите быстрый поиск без необходимости искать во всей таблице.
Учитывая ваше представление, ваша функция настолько эффективна, насколько это возможно. Конечно, как отмечали другие (и практикуется на языках старше Lua), решение вашей реальной проблемы - изменить представление. Когда у вас есть таблицы и вам нужны наборы, вы превращаете таблицы в наборы, используя элемент set в качестве ключа и true
в качестве значения. +1 к интерджаю.