Comments 19
t1 = { "foo" }
t2 = { [1] = "foo" }
t3 = {}; t3[1] = "foo"
должны были бы давать одинаковое внутреннее представление таблиц (все с помощью массива).Тип
cdata
в LuaJIT это userdata
в ванильном Lua?А получается, что все три случая дают разный результат.
t1 = { "foo" }
tostring(t1)
-- table: 0x4082db70
-- a[2]: nil, foo
-- h[1]: nil=nil
t2 = { [1] = "foo" }
tostring(t2)
-- table: 0x4082dfa8
-- a[0]:
-- h[2]: nil=nil, 1=foo
t3 = {}; t3[1] = "foo"
tostring(t3)
-- table: 0x4082e410
-- a[3]: nil, foo, nil
-- h[1]: nil=nil
А есть способ отличить такие таблицы в стандартном языке?
Если эти таблицы использовать в качестве ключа другой таблицы, то какой будет результат?
t = {}
t[ {"foo"} ] =1
t[ { [1] = "foo" } ] = 2
t2 = {}
t2[1] = "foo"
t[ t2 ] = 3
tostring(t)
mikeus дело говорит. Идентичность таблиц проверяется по указателю — это те самые table: 0x4082dfa8
в статье. Иными словами
t1 = {}
t2 = t1
t1 == t2 -- true
t1 == {} -- false
И при поиске ключа поведение будет то же самое.
Cdata — явление исключительно LuaJIT. В ванильном Lua его аналогов нет.
Какой ужас… Никогда не любил этот язык.
А статья интересная, спасибо:)
Что вы подразумаваете по "сайтом, написанном на луа"?
leafo.net/lapis
table[index] = nil
приводит к образованию дырок в массиве, и #table
в этом случае — UB, о чём собственно рассказывает статья. Если у числовых индексов нет какого-то другого прикладного значения, то я бы советовал присмотреться к паттерну t[obj] = true
(https://www.lua.org/pil/11.5.html).
Тогда можно попробовать переносить последний элемент на место удаляемого и обнулять уже по последнему индексу.
Все эти рассуждения о быстроте имеет смысл вести только проведя перф тесты на системе, максимально приближенной к реальным условиям эксплуатации. На мой взгляд проблема undefined behavior куда серьёзнее.
table + 1 как раз указывает на дырку, в которую я могу добавить объект.
Это утверждение не верно. Ни в LuaJIT, ни в PUC-Rio Lua
$ lua
Lua 5.3.3 Copyright (C) 1994-2016 Lua.org, PUC-Rio
> t = {1, 2, 3, 4}
> t[3] = nil
> print(#t)
4
>
Анатомия таблиц LuaJIT и особенности их использования