Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

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

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Lua и массивы


Гость poletaew

Рекомендуемые сообщения

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

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

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

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

1

Да

2

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

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

params = nil

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

params.value = 123

params.name = "Something"

params ["name"]  = "Something"

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

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

3

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

Code:
params.value = nil 

4

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Code:
params.69= "Something"
и

Code:
params  [69]   = "Something"
или обязательно
Code:
params  ["69"]   = "Something"
?
Ссылка на комментарий
Поделиться на другие сайты

Так вот вроде бы нельзя :

Code:
params.69= "Something"

Так можно:

Code:
params   [69]    = "Something"

params   ["69"]    = "Something"

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

Не пробовал. Можно делать так вот:

Code:
local newtable = {}

local params  = {}

params.value = newtable

params.value.a1 = 1

params.value.a2 = "abcd"

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

Ссылка на комментарий
Поделиться на другие сайты

Работает весь стандартный синтаксис Lua 5.0.

RTFM !!! :))

  • Lua 5.0 eng - мануал на английском, 5.0
  • Lua 5.1 rus - мануал на русском, 5.1
Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

Ссылка на комментарий
Поделиться на другие сайты

я пробовал - все так, как я сказал(

кинь мне рабочий кусок кода плиз

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

спасибо

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

спасибо

Ссылка на комментарий
Поделиться на другие сайты

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

и еще....

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

прошло +- 400%.... если не больше

но наверное это единственный вариант попробовать получить миллисекунды

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

Судя по всему я считаю именно колво вызовов в глобальной переменной ..
можно по подробнее что значит абс время... если не затруднит то с примером.. ) заранее благодарен
Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования