Guest poletaew Posted March 1, 2010 Share Posted March 1, 2010 Доброго вечера, друзья. Возникли вопросы по работе Lua с массивами: 1. Объявление массивов Я слышал, что в Lua как и в php динамические типы данных. Т.о., если я объявляю глобальную переменную равную nil, смогу ли я в последствии использовать ее как одно- или многомерный массив? 2. Присваивание значений элементам массива Как создать новый элемент ассоциативного массива? Как присвоить уже существующему элементу какое-либо значение? Желательно на примерах 3. Уничтожение элементов массива И самое интересное - как "убить" элемент массива, не теряя при этом ни сам массив, ни остальные его элементы? И последний вопрос - работает ли это все в том Lua, что нам дали разработчики? ) Quote Link to comment Share on other sites More sharing options...
Mankubus Posted March 1, 2010 Share Posted March 1, 2010 1 Да 2 Тут массивы называются table, моно обращаться так Code: --обнулениеparams = nil --присвоение значения params.value = 123 params.name = "Something" params ["name"] = "Something" --предыдущие 2 выражения выполняют одно и то же, т.е. идентичны При присвоении автоматически создается новый элемент 3 Вот удаление, при этом автоматически значение элемента обнуляется, и место в массиве освобождается (то, что Вы просили) Code: params.value = nil 4 Все работает Вроде бы так, насколько я знаю. Могу ошибаться, конечно. Quote Link to comment Share on other sites More sharing options...
Guest poletaew Posted March 1, 2010 Share Posted March 1, 2010 А если значение цифровое, то можно ли присваивать так: Code: params.69= "Something" и Code: params [69] = "Something" или обязательно Code: params ["69"] = "Something"? Quote Link to comment Share on other sites More sharing options...
Mankubus Posted March 1, 2010 Share Posted March 1, 2010 Так вот вроде бы нельзя : Code: params.69= "Something" Так можно: Code: params [69] = "Something"params ["69"] = "Something" Quote Link to comment Share on other sites More sharing options...
Guest poletaew Posted March 1, 2010 Share Posted March 1, 2010 Большое спасибо! А как насчет многомерных массивов? Code: params [69] ["textvalue"] ="value" - такое позволительно?И чем вычислить длину такого массива, например? Quote Link to comment Share on other sites More sharing options...
Mankubus Posted March 1, 2010 Share Posted March 1, 2010 Не пробовал. Можно делать так вот: Code: local newtable = {}local params = {} params.value = newtable params.value.a1 = 1 params.value.a2 = "abcd" Quote Link to comment Share on other sites More sharing options...
DarkMaster Posted March 1, 2010 Share Posted March 1, 2010 2 poletaew скоро выложу обновленный ДПС метер там как раз динамические структуры данных да и в текущем есть многовложенные смотри код *) Quote Link to comment Share on other sites More sharing options...
Guest Valltron Posted March 3, 2010 Share Posted March 3, 2010 Таблицы в Луа - это вроде массивов, только могут содержать любые данные: строки, числа, другие таблицы, функции и вообще все что угодно... Code: local a = {} --создает пустую таблицуlocal a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 } -- создает заполненную таблицу, эквивалентно do local t = {} t [f(1)] = g t [1] = "x" t [2] = "y" t.x = 1 t [3] = f(x) t [30] = 23 t [4] = 45 a = t end Quote Link to comment Share on other sites More sharing options...
SLA Posted March 3, 2010 Share Posted March 3, 2010 Работает весь стандартный синтаксис Lua 5.0. RTFM !!! ) Lua 5.0 eng - мануал на английском, 5.0 Lua 5.1 rus - мануал на русском, 5.1 Quote Link to comment Share on other sites More sharing options...
merlok Posted March 5, 2010 Share Posted March 5, 2010 давно хотел вставить свои 5 копеек в тему) поправте если чего не так 1. в луа есть несколько путей получения длины массива Code: local alen = metatable(AgroUnits).__len local alen = table.maxn(AgroUnits) local alen = #AgroUnits ну в общем.... ни один из них не работает 2. нивал написал свою либу в которой: Code: function GetTableSize( t ) if not t then return 0 end local count = 0 for k, v in t do count = count + 1 end return count end интересно с какой такой башни я должен длину табла считать циклом? да за такое любого джуниора просто на месте прибьют и причислят к индусам ---------------------------------------- пара анекдотов в тему ) 1. как надо писать в условии булевскую переменную bool b if b.AsString.Length == 4 {} 2. как нужно работать с датой и временем function AddOneSecondToCurrentTime sleep(1000) return now() end ээээээ ниче не напоминаеть? ---------------------------------------- 3. и наконец сами они в коде пользуются этим Code: rawset( table, "getsize", function( tab ) local out = 0 for id, val in pairs( tab ) do out = out + 1 end return out end ) ноу комментс ( выводы: 1. че делать непонятно.... нивал все перекодил в луа 2. а не индусы ли писали интерфейс? Quote Link to comment Share on other sites More sharing options...
merlok Posted March 5, 2010 Share Posted March 5, 2010 еще 1 прикол так сказать 1. берем какуюнить таблицу с полями id, name их полно в их коде.... 2. удаляем все строки функцией table.remove (table [, pos] ) 3. пытаемся получить длину таблицы их функцией и опа ) она равна 1 Quote Link to comment Share on other sites More sharing options...
ramirez Posted March 5, 2010 Share Posted March 5, 2010 Видать, не все удалил. =) Итератор, сгенеренный pairs сразу возвращает nil, если таблица пустая. Цикл не проходит ни одной петли. В 5.0.x нету table.maxn и прочего, что ты написал. Есть только table.getn. Но все это все равно толком работает только для списков. Разрабы юзают Lua как есть, сырьем, библиотеки только стандартные отпилили и влепили Global(), выдранный в ноль из учебника =), и все. Quote Link to comment Share on other sites More sharing options...
Mankubus Posted March 5, 2010 Share Posted March 5, 2010 Анекдоты порадовали ) Разрабы, видимо, не особо запаривались над оптимизацией кода, они какбе намекают нам, как "правильно" писать код, чтобы все работало как у них Quote Link to comment Share on other sites More sharing options...
merlok Posted March 6, 2010 Share Posted March 6, 2010 я пробовал - все так, как я сказал( кинь мне рабочий кусок кода плиз Quote Link to comment Share on other sites More sharing options...
ramirez Posted March 7, 2010 Share Posted March 7, 2010 Если ты про таблицы, то вот простой тест, выполняется lua.exe v.5.0.3: Code: function getsize( t ) local c = 0 for k, v in pairs( t ) do c = c + 1 end return c end print( "size", getsize{} ) --> size 0 Quote Link to comment Share on other sites More sharing options...
Guest KentAVr57 Posted March 10, 2010 Share Posted March 10, 2010 не в тему.. но.. может кто подскажет как в ниваловской луе организовать задержку в милисекундах? чтото типа слип или вайт? спасибо Quote Link to comment Share on other sites More sharing options...
Guest KentAVr57 Posted March 10, 2010 Share Posted March 10, 2010 не в тему.. но.. может кто подскажет как в ниваловской луе организовать задержку в милисекундах? чтото типа слип или вайт? спасибо Quote Link to comment Share on other sites More sharing options...
merlok Posted March 10, 2010 Share Posted March 10, 2010 по таймеру.... тока слип будет кратен 1 с и еще.... он не всегда одну секунду - иногда его долго нет - а потом они всей толпой приходять за 1 секунду Quote Link to comment Share on other sites More sharing options...
Guest KentAVr57 Posted March 10, 2010 Share Posted March 10, 2010 спс за ответ .. по таймеру как я в курсе не устраивает 1 сек... нужны мили.. да и на таймер когда вешается код слабочитаемый становится.. уж больно много всего в комбо запихивать приходится.. Quote: он не всегда одну секунду - иногда его долго нет оО .. это многое объясняет)) .. а то я код отлаживать запарился уже.. неуловимые ошибки искать)) спс буду знать.. Quote Link to comment Share on other sites More sharing options...
Guest kst Posted March 10, 2010 Share Posted March 10, 2010 можно еще воспользоваться виджетами и их визуальными эффектами например виджет TextView и его метод PlayFadeEffect, время проигрывания эффекта задается в миллисекундах. Надо запустить эффект и ловить событие "EVENT_EFFECT_FINISHED". Как поймается (для нужного экземпляра виджета), значит заданное время прошло Quote Link to comment Share on other sites More sharing options...
merlok Posted March 10, 2010 Share Posted March 10, 2010 там событийная схема - я не думаю, что они дадут возможность разработчику - какой бы он ни был... тормозить процедуру обработки события да и встроееной функции я такой не видел..... а по таймеру - там не надо считать количество вызовов - может плохо закончится ) надо брать абс время Quote Link to comment Share on other sites More sharing options...
merlok Posted March 10, 2010 Share Posted March 10, 2010 прошло +- 400%.... если не больше но наверное это единственный вариант попробовать получить миллисекунды Quote Link to comment Share on other sites More sharing options...
Guest kst Posted March 10, 2010 Share Posted March 10, 2010 Ну, я думаю, что прошло все-таки не меньше, чем задано, в вот больше - очень даже может быть, причем возможно намного больше. И ни о какой точности тут мечтать не приходится, слишком много факторов влияют на то, когда управление попадет к обработчику именно этого события. Quote Link to comment Share on other sites More sharing options...
Guest KentAVr57 Posted March 11, 2010 Share Posted March 11, 2010 Quote: а по таймеру - там не надо считать количество вызовов - может плохо закончится )надо брать абс время Судя по всему я считаю именно колво вызовов в глобальной переменной ..можно по подробнее что значит абс время... если не затруднит то с примером.. ) заранее благодарен Quote Link to comment Share on other sites More sharing options...
merlok Posted March 11, 2010 Share Posted March 11, 2010 тут Quote Link to comment Share on other sites More sharing options...
Recommended Posts