Карлан 1 050 Опубликовано 21 Октября 2013 (изменено) Мне нужно получить массив вида aParam = {key1 = value1, key2 = value2...} И отсортировать его по value, далее получить первый элемент таблицы. Оба параметра типа 'number'. local aParam = {} for i=1,10 do local key = math.random(100) local value = math.random(100,200) table.insert(aParam.key, value) --//table.insert(aParam[i].key, value) table.sort(aParam) end print(aCond[1]) => bad argument #1 to 'insert' (table expected, got nil) Даже без результата я знаю, что делаю не верно, ибо массив у меня выходит вида aParam = {key1 = value1}, {key2=value2}... Изменено 21 Октября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 3 Декабря 2014 @Solomon753, я конечно не особо въехал че тебе надо, но по догадкам вот так: for i=1,6 do if (event == "MOUSE_BUTTON_PRESSED" and arg == 1) then MoveMouseRelative(x,y) Sleep(delay) else break end Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 30 Апреля 2015 @Xdlic, используй метатаблицы, в зависимости от условий переопределяешь метод. Для независимых таблиц подходит без всякого странного, с движком так уже не получится, там пока никак не получается (и не только у меня). Схема примерно такая, пишешь дефолтовый метод, пишешь остальные методы (отдельно или в таблицу тут как тебе удобнее), на вызове проверяешь условия которые тебе нужны и переопределяешь текущий метод с помощью метаметода на нужный. @Desertir, это очень грубо и я бы даже сказал несуразно. Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 30 Апреля 2015 @Desertir, с такими выводами можно функцию переписать с таким же успехом. В переопределении нельзя использовать if-then? Это не мой способ, но его для этого и создавали. Можно написать условия и для сложения и для вывода на экран, причем тут командная работа я вообще не понял. Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 6 Мая 2015 @Xdlic, как это игнорируют? Нормально они работают, в т.ч. и на 6 патче, все обновляется, и оператор, и значения. Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 6 Мая 2015 @Nazgool, прочитал, понял, но времени пока нет самому применить и посмотреть, поэтому и не отвечаю. Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 7 Мая 2015 (изменено) @Xdlic, воистину ты занимаешься фигней, insert вставляет значение в nil или в конец, а #t получает количество элементов в таблице тоже по своим условиям, в зависимости есть nil в конце или нет, в итоге мы видим что твоя обертка вообще не несет никакой смысловой нагрузки, если на конце будет nil, то твоя обертка вставит значение вместо первого попавшегося nil, insert работает абсолютно так же. это позволяло бы работать в сталкере с концом строки по упрощенному варианту t[#t+1] = val и t[#t] = nil вместо вызовов функций Внезапно работает. local a = {}a[#a+1] = 1log(a[1]) нигде недоступен можешь рубить последний элемент, потом работать, потом его назад вставлять. я у себя с этим боролся с помощью pairs, вполне нормально выглядит. Изменено 7 Мая 2015 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 13 Июля 2016 Меня интересует - куда Луа определяет переменную, которую инициализируют, например, так: Я могу ответить на этот вопрос. Ни в каком глобальном пространстве, а тем более в _G эта переменная не объявится (при штатной работе). Окружением этой переменной является функция mmm, и далее нее эта переменная будет недоступна, но тем не менее это глобальная переменная, а это бОльшая нагрузка на луа, что крайне не рекомендуется использовать авторами языка. Все, что может быть локальным, должно быть локальным. Если хотите изменить окружение этой переменной, то надо прибегать к действительно корректному коду, и не использовать здесь ни getfenv, ни setfenv. @Kober(BRUC), я предположил, что строка может быть заготовкой для конкатенации с чем-то иным, либо оканчиваться знаком препинания, поэтому привожу свой метод: function get_lit(str) return str:match('(%a)[%s%p]*$') end str = 'Hello!' print(get_lit(str)) str = '"Svoboda": ' print(get_lit(str)) str = 'some TEXT' print(get_lit(str)) Если все-же исследуемая строка предполагается только вида "some text", то достаточно будет вот такого патерна: '(%a)$'. Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 14 Июля 2016 (изменено) @Desertir, эта переменная инициализируется в функции, а не в модуле, в сталкере же при инициализации модуля его поля не инициализируются, поэтому при инициализации этого модуля функция mmm не инициализируется, и отсюда var будет nil. Я понял слово инициализация в вопросе, как инициализация модуля, а не функции. Если же имелась ввиду инициализация переменной через инициализацию функции, то в таком случае переменной var установиться окружение текущего модуля (он в приоритете) или _G (при штатной работе, именно поэтому я упомянул возможность изменения окружения отдельным полям модуля). Иными словами, без инициализации поля модуля (с) этой переменной ее не будет существовать ни в _G ни в каком-либо другом глобальном пространстве. Проверь сам: function mmm() var = 123 end function test() log('var = %s:<1>', _G[script_name()].var) --// инициализирован модуль mmm() log('var = (%s|%s):<2>', _G[script_name()].var, _G.var) --// инициализирована функция (в текущем случае и переменная) end В коде я постарался наглядно показать когда инициализируется переменная, а также окружение, которое ей задается при штатной работе. Т.о., все так, как я и говорил в посте выше, если переменная объявлена в модуле, то после инициализации модуля этот модуль и становиться ее окружением, если она объявлена в функции, то после инициализации функции окружением переменной устанавливается модуль функции или _G. Прочти 14 главу. https://www.lua.org/pil/14.html Изменено 14 Июля 2016 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 14 Июля 2016 (изменено) Во первых сталкер в этой теме ни при чем, тут общие вопросы.Окей, тогда я могу сказать, что и в сталкере и в Lua при (пере)подключении модуля (например два варианта: чистый реквайринг (для Lua) и обращение через _G (для сталкера)) его поля (функции разумеется) не инициализируются. Сталкер я упомянул лишь для справки, так как форум все таки тематический, и логично предположить, что некоторые вопрошающие все-таки требуют подсказок применительно к Lua игры . Во вторых лучше ты прочти что значит инициализация и объявление переменных. Тогда сразу станет понятно, что функция mmm вызывается (когда то и где то), а не просто болтается в модуле.Все-таки лучше ты перечитай, такого там нет. А реальное положение вещей как-раз в тех, по твоему, 5%. Или тебе все-таки привести реальный пример из оригинальных скриптов сталкера, когда не то что функции, а целые модули просто болтаются? Какие-то странные претензии, где я не прав применительно к штатному Lua? Если ошибок нет, зачем упоминать про сталкер, когда в данном контексте ясно, что логика работы совпадает. К тому же совершенно не ясно почему функция должна где-то и когда-то вызываться, это не есть хорошо, но это совершенно не обязательное условие. Простой пример - шаблонные функции заготовленные заранее. Изменено 14 Июля 2016 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 22 Июля 2016 Не оно? action1 = function() print(1) end action2 = function() print(2) end local t = {action1, action2} print(t[math.random(#t)]()) Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 24 Июля 2016 @KitkaT.Net, разумеется она сбрасывается. Модуль при загрузке игры переинициализируется, я уже не раз это говорил. И при загрузке игры без обращения к функции где идет рандомизация она у тебя будет равна nil. Делай рандомизацию непосредственно перед проверкой. 1 Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 18 Октября 2016 А уж как я удивился, когда 5 лет работавший скрипт начал то чудеса выдавать, то вообще вылеты от сравнения таблицы с намбером... Я точно помню, что тебе про это говорил еще когда ты со скриптом динамической погоды возился, у меня тогда он летал как фанера вот как-раз поэтому . У меня такое всегда дает nil, поэтому такие твои конструкции я тогда переписал на горячо тобою любимые cfg_get_string. Впрочем да, @Nazgool совершенно верно подметил про сталкерский луа, конкретно у нас есть абсолютно такой, наверное, пример который можно в учебники писать. Патерн есть один не нормальный, приведя его к нормальному виду луа радуется, а обычный сталкерский луа ругается. Опытным путем, установкой нового luajit (2.1.0), получена эта народная забава, патерн не работающий на каноничном luajit прекрасно заработал на новом, да еще как! То есть я веду к тому, что не стоит пытаться кого-то чем-то зацепить, но вот так вот есть и с этим ничего не поделать, логика работы действительно разная, причем как в явных моментах (исходя из официальной документации), так и в неявных., такой вот да, шарм сталкерского луа. Поделиться этим сообщением Ссылка на сообщение
Карлан 1 050 Опубликовано 24 Января 2017 Помнится, когда-то давно была рубка по поводу string.*( s, ... ) vs. s:*( ... ) Сегодня внезапно обнаружил, что for ss in s:*() пытается скорее получить что-то из s, чем из s:*() Так @Nazgool же про это достаточно подробно изложил, только вот я не помню, тут на форуме, или мне в скайпе. Одно другому не равно в определенных случаях, и это понятно. Дело не в сталкерском луа, а в синтаксисе, вполне обычная ситуация и для оригинального луа, если я, конечно, верно понял о чем ты. Поделиться этим сообщением Ссылка на сообщение