Перейти к контенту

Язык Lua. Общие вопросы программирования


Malandrinus

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

(изменено)

Мне нужно получить массив вида

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}... 

Изменено пользователем Карлан

Поделиться этим сообщением


Ссылка на сообщение

@Solomon753, я конечно не особо въехал че тебе надо, но по догадкам вот так:

for i=1,6 do
if (event == "MOUSE_BUTTON_PRESSED" and arg == 1) then
MoveMouseRelative(x,y)
Sleep(delay)
else
break
end

Поделиться этим сообщением


Ссылка на сообщение

@Xdlic, используй метатаблицы, в зависимости от условий переопределяешь метод. Для независимых таблиц подходит без всякого странного, с движком так уже не получится, там пока никак не получается (и не только у меня). 

 

Схема примерно такая, пишешь дефолтовый метод, пишешь остальные методы (отдельно или в таблицу тут как тебе удобнее), на вызове проверяешь условия которые тебе нужны и переопределяешь текущий метод с помощью метаметода на нужный.

 

@Desertir, это очень грубо и я бы даже сказал несуразно.

Поделиться этим сообщением


Ссылка на сообщение

@Desertir, :D с такими выводами можно функцию переписать с таким же успехом. В переопределении нельзя использовать if-then? Это не мой способ, но его для этого и создавали. Можно написать условия и для сложения и для вывода на экран, причем тут командная работа я вообще не понял.

Поделиться этим сообщением


Ссылка на сообщение

@Xdlic, как это игнорируют? Нормально они работают, в т.ч. и на 6 патче, все обновляется, и оператор, и значения.

Поделиться этим сообщением


Ссылка на сообщение

@Nazgool, прочитал, понял, но времени пока нет самому применить и посмотреть, поэтому и не отвечаю.

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@Xdlic, воистину ты занимаешься фигней, insert вставляет значение в nil или в конец, а #t получает количество элементов в таблице тоже по своим условиям, в зависимости есть nil в конце или нет, в итоге мы видим что твоя обертка вообще не несет никакой смысловой нагрузки, если на конце будет nil, то твоя обертка вставит значение вместо первого попавшегося nil, insert работает абсолютно так же.
 


это позволяло бы работать в сталкере с концом строки по упрощенному варианту t[#t+1] = val и t[#t] = nil вместо вызовов функций

Внезапно работает. 
local a = {}
a[#a+1] = 1
log(a[1])

 

 

нигде недоступен

можешь рубить последний элемент, потом работать, потом его назад вставлять.


я у себя с этим боролся с помощью pairs, вполне нормально выглядит.

Изменено пользователем Карлан

Поделиться этим сообщением


Ссылка на сообщение

Меня интересует - куда Луа определяет переменную, которую инициализируют, например, так:

Я могу ответить на этот вопрос. Ни в каком глобальном пространстве, а тем более в _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)$'.

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

@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

Изменено пользователем Карлан

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Во первых сталкер в этой теме ни при чем, тут общие вопросы.

Окей, тогда я могу сказать, что и в сталкере и в Lua при (пере)подключении модуля (например два варианта: чистый реквайринг (для Lua) и обращение через _G (для сталкера)) его поля (функции разумеется) не инициализируются. Сталкер я упомянул лишь для справки, так как форум все таки тематический, и логично предположить, что некоторые вопрошающие все-таки требуют подсказок применительно к Lua игры :).

 

Во вторых лучше ты прочти что значит инициализация и объявление переменных. Тогда сразу станет понятно, что функция mmm вызывается (когда то и где то), а не просто болтается в модуле.

Все-таки лучше ты перечитай, такого там нет. А реальное положение вещей как-раз в тех, по твоему, 5%. Или тебе все-таки привести реальный пример из оригинальных скриптов сталкера, когда не то что функции, а целые модули просто болтаются? :)

 

Какие-то странные претензии, где я не прав применительно к штатному Lua? Если ошибок нет, зачем упоминать про сталкер, когда в данном контексте ясно, что логика работы совпадает. К тому же совершенно не ясно почему функция должна где-то и когда-то вызываться, это не есть хорошо, но это совершенно не обязательное условие. Простой пример - шаблонные функции заготовленные заранее.

Изменено пользователем Карлан

Поделиться этим сообщением


Ссылка на сообщение

Не оно?

action1 = function() print(1) end
action2 = function() print(2) end
local t = {action1, action2}
print(t[math.random(#t)]())

Поделиться этим сообщением


Ссылка на сообщение

@KitkaT.Net, разумеется она сбрасывается. Модуль при загрузке игры переинициализируется, я уже не раз это говорил. И при загрузке игры без обращения к функции где идет рандомизация она у тебя будет равна nil. Делай рандомизацию непосредственно перед проверкой.

  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

А уж как я удивился, когда 5 лет работавший скрипт начал то чудеса выдавать, то вообще вылеты от сравнения таблицы с намбером...

Я точно помню, что тебе про это говорил еще когда ты со скриптом динамической погоды возился, у меня тогда он летал как фанера вот как-раз поэтому :). У меня такое всегда дает nil, поэтому такие твои конструкции я тогда переписал на горячо тобою любимые cfg_get_string.

 

Впрочем да, @Nazgool совершенно верно подметил про сталкерский луа, конкретно у нас есть абсолютно такой, наверное, пример который можно в учебники писать. Патерн есть один не нормальный, приведя его к нормальному виду луа радуется, а обычный сталкерский луа ругается. Опытным путем, установкой нового luajit (2.1.0), получена эта народная забава, патерн не работающий на каноничном luajit прекрасно заработал на новом, да еще как! То есть я веду к тому, что не стоит пытаться кого-то чем-то зацепить, но вот так вот есть и с этим ничего не поделать, логика работы действительно разная, причем как в явных моментах (исходя из официальной документации), так и в неявных., такой вот да, шарм сталкерского луа.

Поделиться этим сообщением


Ссылка на сообщение

Помнится, когда-то давно была рубка по поводу string.*( s, ... ) vs. s:*( ... ) Сегодня внезапно обнаружил, что for ss in s:*() пытается скорее получить что-то из s, чем из s:*()

Так @Nazgool же про это достаточно подробно изложил, только вот я не помню, тут на форуме, или мне в скайпе. Одно другому не равно в определенных случаях, и это понятно. Дело не в сталкерском луа, а в синтаксисе, вполне обычная ситуация и для оригинального луа, если я, конечно, верно понял о чем ты.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

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