Pull to refresh

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

И при поиске ключа поведение будет то же самое.

Userdata в LuaJIT никуда не делась, это часть спецификации языка.
Cdata — явление исключительно LuaJIT. В ванильном Lua его аналогов нет.

Какой ужас… Никогда не любил этот язык.
А статья интересная, спасибо:)

Rosik, не могли бы написать туториал (или ткнуть на подобный в интернете) о том как «поднять» на Дебиане сайт написанный на LUA с использованием LuaJIT?

Что вы подразумаваете по "сайтом, написанном на луа"?

Скрипт который генерит простейший html-код страницы который открывается браузером.

Кажется вы ищите что-то типа web framework. Попробуйте почитать тут или тут, возможно это подойдёт.

Вот фреймворк, который поможет поднять сайт, написанный на Lua с использованием LuaJIT:
leafo.net/lapis
UFO just landed and posted this here

table[index] = nil приводит к образованию дырок в массиве, и #table в этом случае — UB, о чём собственно рассказывает статья. Если у числовых индексов нет какого-то другого прикладного значения, то я бы советовал присмотреться к паттерну t[obj] = true (https://www.lua.org/pil/11.5.html).

UFO just landed and posted this here

Тогда можно попробовать переносить последний элемент на место удаляемого и обнулять уже по последнему индексу.

Все эти рассуждения о быстроте имеет смысл вести только проведя перф тесты на системе, максимально приближенной к реальным условиям эксплуатации. На мой взгляд проблема 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
>
UFO just landed and posted this here
Sign up to leave a comment.