Сохранение и чтение таблиц в файле

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Сохранение и чтение таблиц в файле

Post by zg »

Latest post of the previous page:

Code: Select all

local function LongTableToString(arr, sSep)
  local res={}
  local convert=function(name,value)
    local vtype=type(value)
    if vtype=='number' or vtype=='string' or vtype=='boolean' or vtype=='table' then
      if vtype=='string' then
        value=string.format('%q',value)
      elseif vtype=='table' then
        value=LongTableToString(value,sSep)
      else
        value=tostring(value)
      end
      if name then value=name..'='..value end
      table.insert(res,value)
    end
  end
  for _,v in ipairs(arr) do convert(false,v) end
  for i,v in pairs(arr) do if type(i)~='number' then convert(i,v) end end
  return '{\n'..table.concat(res,sSep)..'\n}'
end
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Сохранение и чтение таблиц в файле

Post by John Doe »

Code: Select all

local t = {1,2,3,[5]=5,a="a"}
return LongTableToString(t,",")
Получаем:

Code: Select all

{
1,2,3,a="a"
}
(5 пропущено)

И надо учитывать, что нет защиты от таблиц с перекрёстными ссылками
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Сохранение и чтение таблиц в файле

Post by buniak_a_h »

John Doe wrote: Tue 03 Oct, 2017 13:54(5 пропущено)
Ну да, я это знал. Просто в моём случае пропуск значения при числовых индексах неактуален.
John Doe wrote: Tue 03 Oct, 2017 13:54И надо учитывать, что нет защиты от таблиц с перекрёстными ссылками
Как раз защита от перекрёстных ссылок занимала у меня наибольшее время: другого способа, кроме как запомнить ссылку на таблицу, а при повторной подставлять запомненное значение, я не знаю. А поиск ссылки - долгое дело...
Первую проблему, в принципе, решает функция serialize из LuaMacro\api.lua. Увы, циклическая ссылка, насколько я понимаю, её тоже вышибет. НЕ ПРОВЕРЯЛ.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Сохранение и чтение таблиц в файле

Post by John Doe »

buniak_a_h wrote: Tue 03 Oct, 2017 15:23Как раз защита от перекрёстных ссылок занимала у меня наибольшее время
А откуда в вашем случае такие ссылки?
buniak_a_h wrote: Tue 03 Oct, 2017 15:23 А поиск ссылки - долгое дело...
Разве?
И при повторной чаще всего достаточно пропускать.
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

Сохранение и чтение таблиц в файле

Post by buniak_a_h »

John Doe wrote: Tue 03 Oct, 2017 17:17
buniak_a_h wrote: Tue 03 Oct, 2017 15:23Как раз защита от перекрёстных ссылок занимала у меня наибольшее время
А откуда в вашем случае такие ссылки?
Именно потому, что их у меня и нету, я отказался от этой проверки
John Doe wrote: Tue 03 Oct, 2017 17:17
buniak_a_h wrote: Tue 03 Oct, 2017 15:23 А поиск ссылки - долгое дело...
Разве?
И при повторной чаще всего достаточно пропускать.
Не совсем так. При первой ссылке на таблицу надо её преобразовывать, и запоминать пару ссылок {старая,новая (в виде текста, возможно)}. При повторной вместо преобразования подтаблицы просто указывать ссылку на уже преобразованную.
Стандартная ситуация - когда во вложенной таблице есть ссылка на owner - ту, в которую эта вложена. Сталкивался, но не в этом проекте. Так что тема не совсем отвлечённая.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Сохранение и чтение таблиц в файле

Post by John Doe »

buniak_a_h wrote: Tue 03 Oct, 2017 15:23функция serialize из LuaMacro\api.lua. Увы, циклическая ссылка, насколько я понимаю, её тоже вышибет. НЕ ПРОВЕРЯЛ.
Не вышибет, циклические ссылки поддерживаются.
Post Reply

Return to “Нужна помощь”