Передача массива в функцию - теряется последовательность ключей

Страницы: 1
RSS
Передача массива в функцию - теряется последовательность ключей
 
Добрый день.

Передаю в функцию 3 переменных, третья из которых массив = {}

Код
LogWrite("report", comment, {Trade=100, Code=Si, Q="-"..10, Price=10000, Pips=1});

В функции делаю чтение массива:
Код
function LogWrite(name, log_type, log_array)

   local content = "";
   local i = 1;
   for key, value in pairs(log_array) do
      content = content.."\t"..value..";";
      content = string.gsub(content,"([.]+)",",");
      i = i + 1;
   end;
   message(tostring(content));
   
end;
Массив считывается через цикл, но почему-то у него получается иная последовательность.
На выходе ожидаю строку: 100; Si; -10; 10000; 1;
По факту последовательность другая: Si; 1; 100; -10; 10000;

С чем это может быть связано?
Торговый привод на Lua http://iv-litovchenko.ru/
 
Цитата
Иван написал:
С чем это может быть связано?
С тем, что это не массив, а хэш-таблица.
 
Мне хотелось бы в функцию передавать именно массив в таком виде (хэш-таблице).
Но как тогда сохранить порядок ключей что передается?
Торговый привод на Lua http://iv-litovchenko.ru/
 
Цитата
Иван написал:
Мне хотелось бы в функцию передавать именно массив в таком виде (хэш-таблице).
Но как тогда сохранить порядок ключей что передается?
В таком виде - никак. Сравните с сями, у вас либо структура и вы обращаетесь к элементам по имени (t.a, t.b) и вообще нет способа по ним итерировать, либо у вас массив и вы обращаетесь по индексу (t[0], t[1]) и имен никаких нет. Тут то же самое, либо имена (плюс еще и возможность в цикле по ним пройти, хоть и в непредсказуемом порядке, с помощью pairs), либо индексы и ipairs в заданном порядке.
 
Цитата
Иван написал:
Мне хотелось бы в функцию передавать именно массив в таком виде (хэш-таблице).
Но как тогда сохранить порядок ключей что передается?
Вы можете создать метамод для такой таблицы, чтобы при вставке происходила сортировка по представлению ключа и сохранялась в внутренний отсортированный массив.
Плюс надо создать итератор класса по внутренней таблице, выводящий значения. Но это сложная структура и удвоение памяти.

Для хранения проще всего создать отдельный массив ключей в нужном порядке. А уже перебирая его, получать значения в постоянном порядке.  
 
Цитата
Иван написал:
LogWrite("report", comment, {Trade=100, Code=Si, Q="-"..10, Price=10000, Pips=1});
В функции делаю чтение массива:Код
function LogWrite(name, log_type, log_array)

  local content = "";
  local i = 1;
  for key, value in pairs(log_array) do
     content = content.."\t"..value..";";
     content = string.gsub(content,"([.]+)",",");
     i = i + 1;
  end;
  message(tostring(content));
 
end;
function LogWrite(name, log_type,t)
  local content = "";
  local i = 1;
  for m=1,#t do
local value=tostring(t[m])
     content = content.."\t"..value..";";
     content = string.gsub(content,"([.]+)",",");
     i = i + 1;
  end;
  message(tostring(content));
end;
local Si=123
LogWrite("report", "", {100,Si,"-"..10,10000,1});
-------------------
100; 123; -10; 10000; 1;
>Exit code: 0
 
Цитата
Николай Камынин написал:
Цитата
Иван написал:
LogWrite("report", comment, {Trade=100, Code=Si, Q="-"..10, Price=10000, Pips=1});
В функции делаю чтение массива:Код
function LogWrite(name, log_type, log_array)

  local content = "";
  local i = 1;
  for key, value in pairs(log_array) do
     content = content.."\t"..value..";";
     content = string.gsub(content,"([.]+)",",");
     i = i + 1;
  end;
  message(tostring(content));
 
end;
function LogWrite(name, log_type,t)
  local content = "";
  local i = 1;
  for m=1,#t do
local value=tostring(t[m])
     content = content.."\t"..value..";";
     content = string.gsub(content,"([.]+)",",");
     i = i + 1;
  end;
  message(tostring(content));
end;
local Si=123
LogWrite("report", "", {100,Si,"-"..10,10000,1});
-------------------
100; 123; -10; 10000; 1;
>Exit code: 0
Наверное это единственное простое решение.
Торговый привод на Lua http://iv-litovchenko.ru/
Страницы: 1
Читают тему (гостей: 2)
Наверх