Снова всем привет.
Возникла необходимость во время исполнения скрипта Lua добавлять в таблицу новые таблицы. Как я понял ничего кроме table.insert это не сможет сделать прямо на ходу. И как обычно, то ли функция не позволяет сделать так, как мне надо, толи я с синтаксисом нифига не разбираюсь. Вобщем по сути.
Есть пустой массив calculate = {}. Далее я запускаю скрипт, который должен прочитать таблицу trades в квике и на каждой итерации возвращает таблицу trade
trade = getItem("trades", y)
Привожу только часть, ибо это не относится к теме. Это все работает, данные я получаю.
Теперь полученные данные мне надо распихать по таблице calculate. Структура таблицы примерно такая
calculate = {
"код инструмента 1" = {lots = trade.qty, ... , price = trade.price}
...
"код инструмента 9" = {lots = trade.qty, ... , price = trade.price}
"код инструмента n" = {lots = trade.qty, ... , price = trade.price}
Проблема заключается в следующем. Я заранее не знаю какие инструменты я получу, т.к. торги веду в том числе и вручную. Отсюда возникает дилемма и как я вижу два выхода:
1. Создавать прямо во время исполнения скрипта новый строковый индекс "код инструмента n" и заполнять его. Красиво и экономит память. Неоспоримое преимущество такого метода является так же и то, что массив будет автоматически дополняться независимо ни от чего. Даже если добавится новый инструмент и я решу поторговать на нем вручную.
2. Создать массив заранее, еще до запуска тела скрипта со всеми возможными инструментами. Но тогда в случае добавления нового инструмента на бирже придется корректировать сам скрипт. При этом таблица будет отжирать часть оперативы, пусть совсем чуть чуть, но будет.
2 вариант я вообще не рассматриваю, поэтому вариант 1.
Сейчас я учусь применять table.insert, выходит примерно так
if calculate[trade.sec_code] == nil then
table.insert(calculate, trade.sec_code = {lots = trade.qty})
message("Количество: " .. tostring(calculate[trade.sec_code].lots))
end
И получаю ошибку
что скорее всего намекает на ошибку в синтаксисе, либо функция не принимает такую запись, либо я сам ошибся в записи...
Попробовал сделать так
if calculate[trade.sec_code] == nil then
table.insert(calculate, {trade.qty, trade.price})
message("Количество: " .. tostring(calculate[trade.sec_code].lots))
end
функция запись проглотила, вместе с вложенным массивом. Да, месседж выдал ошибку и это естественно...
Неужели эта функция действительно не может разом все сделать?
Попробовал сделать и так
if calculate[trade.sec_code] == nil then
table.insert(calculate, trade.sec_code)
table.insert(calculate[trade.sec_code], "lots")
calculate[trade.sec_code].lots = trade.qty
message("Количество: " .. tostring(calculate[trade.sec_code].lots))
end
нарываюсь на
bad argument #1 to 'insert' (table expected, got nil)
в строке table.insert(calculate[trade.sec_code], "lots") и понимаю что предыдущая строка делает совсем не то что я ожидаю, а добавляет в конец массива значение из trade.sec_code...
Также попробовал и так
if calculate[trade.sec_code] == nil then
table.insert(calculate, trade.sec_code, trade)
end
И опять нарвался на bad argument #2 to 'insert' (number expected, got string) и понимаю что второй аргумент должен быть числом, а мне нужна именно строка...
Подскажите как тогда создать строковый индекс(если он конечно же не существует) в таблице во время работы скрипта??? Так сказать на ходу. Как я понял метатаблицы и метод _index меня здесь тоже не спасут, ибо столкнусь с той же самой проблемой создания строкового индекса.