Jump to content
Alloder.pro  about Allods with love 😱
Search In
  • More options...
Find results that contain...
Find results in...

Servers monitoring and the Addons Editor

We present you two legends. All dreams come true.

Servers monitoring The Addons Editor

Digest April

We talk about what was done and updated in the past month. We help keep abreast of events.

Read more

Game tooltips

Tooltips provide a way for 3rd party fansites and extensions to display detailed information on mouseover.

Read more

Lua и массивы


Guest poletaew
 Share

Recommended Posts

Guest poletaew

Доброго вечера, друзья.

Возникли вопросы по работе Lua с массивами:

1. Объявление массивов

Я слышал, что в Lua как и в php динамические типы данных. Т.о., если я объявляю глобальную переменную равную nil, смогу ли я в последствии использовать ее как одно- или многомерный массив?

2. Присваивание значений элементам массива

Как создать новый элемент ассоциативного массива? Как присвоить уже существующему элементу какое-либо значение? Желательно на примерах :)

3. Уничтожение элементов массива

И самое интересное - как "убить" элемент массива, не теряя при этом ни сам массив, ни остальные его элементы?

И последний вопрос - работает ли это все в том Lua, что нам дали разработчики? )

Link to comment
Share on other sites

1

Да

2

Тут массивы называются table, моно обращаться так

Code:
--обнуление

params = nil

--присвоение значения

params.value = 123

params.name = "Something"

params ["name"]  = "Something"

--предыдущие 2 выражения выполняют одно и то же, т.е. идентичны

При присвоении автоматически создается новый элемент

3

Вот удаление, при этом автоматически значение элемента обнуляется, и место в массиве освобождается (то, что Вы просили)

Code:
params.value = nil 

4

Все работает ;)

Вроде бы так, насколько я знаю. Могу ошибаться, конечно.

Link to comment
Share on other sites

Guest poletaew

А если значение цифровое, то можно ли присваивать так:

Code:
params.69= "Something"
и

Code:
params  [69]   = "Something"
или обязательно
Code:
params  ["69"]   = "Something"
?
Link to comment
Share on other sites

Guest poletaew

Большое спасибо!

А как насчет многомерных массивов?

Code:
params [69] ["textvalue"] ="value"
- такое позволительно?

И чем вычислить длину такого массива, например?

Link to comment
Share on other sites

2 poletaew скоро выложу обновленный ДПС метер там как раз динамические структуры данных да и в текущем есть многовложенные смотри код *)

Link to comment
Share on other sites

Guest Valltron

Таблицы в Луа - это вроде массивов, только могут содержать любые данные: строки, числа, другие таблицы, функции и вообще все что угодно...

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

Link to comment
Share on other sites

давно хотел вставить свои 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. а не индусы ли писали интерфейс?

Link to comment
Share on other sites

еще 1 прикол так сказать

1. берем какуюнить таблицу с полями id, name

их полно в их коде....

2. удаляем все строки функцией table.remove (table [, pos] )

3. пытаемся получить длину таблицы их функцией

и опа ) она равна 1

Link to comment
Share on other sites

Видать, не все удалил. =) Итератор, сгенеренный pairs сразу возвращает nil, если таблица пустая. Цикл не проходит ни одной петли.

В 5.0.x нету table.maxn и прочего, что ты написал. Есть только table.getn. Но все это все равно толком работает только для списков. Разрабы юзают Lua как есть, сырьем, библиотеки только стандартные отпилили и влепили Global(), выдранный в ноль из учебника =), и все.

Link to comment
Share on other sites

Анекдоты порадовали )

Разрабы, видимо, не особо запаривались над оптимизацией кода, они какбе намекают нам, как "правильно" писать код, чтобы все работало как у них

Link to comment
Share on other sites

Если ты про таблицы, то вот простой тест, выполняется 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

Link to comment
Share on other sites

Guest KentAVr57

не в тему.. но..

может кто подскажет как в ниваловской луе организовать задержку в милисекундах?

чтото типа слип или вайт?

спасибо

Link to comment
Share on other sites

Guest KentAVr57

не в тему.. но..

может кто подскажет как в ниваловской луе организовать задержку в милисекундах?

чтото типа слип или вайт?

спасибо

Link to comment
Share on other sites

по таймеру.... тока слип будет кратен 1 с

и еще....

он не всегда одну секунду - иногда его долго нет - а потом они всей толпой приходять за 1 секунду

Link to comment
Share on other sites

Guest KentAVr57

спс за ответ .. по таймеру как я в курсе не устраивает 1 сек... нужны мили.. да и на таймер когда вешается код слабочитаемый становится.. уж больно много всего в комбо запихивать приходится..

Quote:
он не всегда одну секунду - иногда его долго нет

оО .. это многое объясняет)) .. а то я код отлаживать запарился уже.. неуловимые ошибки искать))

спс буду знать..

Link to comment
Share on other sites

можно еще воспользоваться виджетами и их визуальными эффектами

например виджет TextView и его метод PlayFadeEffect, время проигрывания эффекта задается в миллисекундах. Надо запустить эффект и ловить событие "EVENT_EFFECT_FINISHED". Как поймается (для нужного экземпляра виджета), значит заданное время прошло :)

Link to comment
Share on other sites

там событийная схема - я не думаю, что они дадут возможность

разработчику - какой бы он ни был... тормозить процедуру обработки события

да и встроееной функции я такой не видел.....

а по таймеру - там не надо считать количество вызовов - может плохо закончится )

надо брать абс время

Link to comment
Share on other sites

Ну, я думаю, что прошло все-таки не меньше, чем задано, в вот больше - очень даже может быть, причем возможно намного больше. И ни о какой точности тут мечтать не приходится, слишком много факторов влияют на то, когда управление попадет к обработчику именно этого события.

Link to comment
Share on other sites

Guest KentAVr57
Quote:
а по таймеру - там не надо считать количество вызовов - может плохо закончится )
надо брать абс время

Судя по всему я считаю именно колво вызовов в глобальной переменной ..
можно по подробнее что значит абс время... если не затруднит то с примером.. ) заранее благодарен
Link to comment
Share on other sites

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use