Dennis_Chikin 3 665 Опубликовано 4 Января 2015 Поделиться Опубликовано 4 Января 2015 (изменено) С чего начинать и где взять. Установка Lua:http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106 Руководство «Программирование на языке Lua», третье издание:http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308 Изменено 2 Марта 2015 пользователем Kirgudu Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-905371
Nazgool 250 Опубликовано 2 Февраля 2013 Поделиться Опубликовано 2 Февраля 2013 (изменено) abramcumner Спасибо за исследования.. Полезная информация. Но...Ни фига не понимаю в том, что не касается Lua(т.е. код С, С++), но из того что ты привёл (даже я понял принцип), действительно - вопрос закрыт. Изменено 2 Февраля 2013 пользователем Gun12 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-756904
Dennis_Chikin 3 665 Опубликовано 24 Февраля 2013 Поделиться Опубликовано 24 Февраля 2013 Интересно, насколько неправильно я понимаю, что имея функцию вида function inc_a( a ) return a+1 end обращаться к ней как this.inc_a( a ) - бессмысленно чуть более, чем полностью ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-759702
Malandrinus 615 Опубликовано 24 Февраля 2013 Автор Поделиться Опубликовано 24 Февраля 2013 Dennis_Chikin, не совсем понятно, о чём именно вопрос. Именно к такой функции бессмысленно? Или используя this? this - это ссылка на текущий модуль. Не до конца уверен, чей именно это сервис - внутренний игры или luabind, но точно не чистого Lua. Насчёт того, работает ли. У меня работает, я это даже использовал в своей реализации сохраняемых таймеров для отвязки от необходимости явно указывать имя модуля, в котором расположен код таймера. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-759703
Dennis_Chikin 3 665 Опубликовано 24 Февраля 2013 Поделиться Опубликовано 24 Февраля 2013 (изменено) :не совсем понятно, о чём именно вопрос. Именно к такой функции бессмысленно? Да, именно такой. Или реальный пример:dialogs.script: function is_wounded(first_speaker, second_speaker) if db.storage[first_speaker:id()].wounded ~= nil and db.storage[first_speaker:id()].wounded.wound_manager.can_use_medkit == true then return false end return xr_wounded.is_wounded(first_speaker) end function is_not_wounded(first_speaker, second_speaker) return not this.is_wounded(first_speaker, second_speaker) end На правильное использование похоже вотэто: class "motivator_binder" ( object_binder ) ... :bind_object(this.motivator_binder(npc)) для отвязки от необходимости явно указывать имя модуля, в котором расположен код таймера.В смысле ? global name space ? функция в одном модуле, зовем из другого ? Изменено 24 Февраля 2013 пользователем Dennis_Chikin Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-759715
Nazgool 250 Опубликовано 24 Февраля 2013 Поделиться Опубликовано 24 Февраля 2013 Dennis_Chikin, Именно к такой функции не бессмысленно. В отличии от модулей lua, в Сталкере, для функций каждого из файлов(т.е. модулей), окружением устанавливается не данный модуль, а глобальное окружение (_G) ! При вызове функций (использовании не локальных переменных), их поиск будет происходить в таблице _G. Поэтому, если вызвать функцию из примера просто как is_wounded(...), то эта функция будет и запрашиваться из таблицы _G. Там такой нет. Вылет. Функции с такими названиями есть в нескольких файлах (модулях). Напр. в xr_conditions, xr_wounded ну и в dialogs. Вот, как известно, и вызывается как имя_модуля.имя_функции : xr_wounded.is_wounded , dialogs.is_wounded ... Имена то загруженных модулей в _G есть. Также для каждого модуля устанавливается поле с именем - this (типа _М в lua) и значением - сам модуль (таблица, юзердата не важно) Теперь, если функция из модуля, должна вызвать другую функцию из этого же модуля, то нужно писать(из указанного примера) dialogs.is_wounded(...). Но поскольку есть переменная this (синоним dialogs), то можно писать и this.is_wounded(...) что одно и то же в рамках одного модуля. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-759808
Shredder 49 Опубликовано 25 Февраля 2013 Поделиться Опубликовано 25 Февраля 2013 Поэтому, если вызвать функцию из примера просто как is_wounded(...), то эта функция будет и запрашиваться из таблицы _G. Там такой нет. Вылет. Я видимо что-то не понимаю. Сперва поиск функции будет осуществляться в текущем модуле (_M), там она есть. От куда вылет? Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-759823
Callisto 2 Опубликовано 15 Марта 2013 Поделиться Опубликовано 15 Марта 2013 Доброго времени суток. И снова у меня вопрос из разряда элементарных-дурацких, но все же... Получаю я строку, в которой у всех букв нижний регистр и мне необходимо преобразовать первую букву в верхний. В принципе, ничего сложного, с но почему-то при кодировке 1251 функция string.upper не работает. Ну, и собственно вопрос: как быть? Можно ли изменить кодировку строки? Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-763458
Artos 99 Опубликовано 15 Марта 2013 Поделиться Опубликовано 15 Марта 2013 Callisto, функции обработки текста в Lua (да и не только) ориентированы на латиницу и не следует ожидать бОльшего, чем заложено... ;-) Придется "обучать" хоть как-то распознавать и заменять. В свое время написал спеллер для подобного твоему случаю, может сгодится в исходном виде или можно использовать сам принцип: 1. Создаем табличку соответствий малых - заглавным: tbl_LowUp = { ["а"] = "А", ["б"] = "Б", ["в"] = "В", ["г"] = "Г", ["д"] = "Д", ["е"] = "Е", ["ё"] = "Ё", ["ж"] = "Ж", ["з"] = "З", ["и"] = "И", ["й"] = "Й", ["к"] = "К", ["л"] = "Л", ["м"] = "М", ["н"] = "Н", ["о"] = "О", ["п"] = "П", ["р"] = "Р", ["с"] = "С", ["т"] = "Т", ["у"] = "У", ["ф"] = "Ф", ["х"] = "Х", ["ц"] = "Ц", ["ч"] = "Ч", ["ш"] = "Ш", ["щ"] = "Щ", ["ъ"] = "Ъ", ["ы"] = "Ы", ["ь"] = "ь", ["э"] = "Э", ["ю"] = "Ю", ["я"] = "Я" } 2. Используем функцию для перевода 1-го символа строки в Upper: function SpellingBeginning(text) local str = text and text:match('^%s*(.*)') --/ убираем начальные пробелы if not (str and str ~= "") then return text end --/> текст без значимых символов local first = str:sub(1,1) --/ 1-ый символ строки if first:match('%l') then --/ если буква в малом регистре str = str:upper(first)..(str:sub(2) or "") --/ меняем на заглавную elseif not first:match('%p') then --/ если не латиница...(кириллица!) for low,up in pairs(tbl_LowUp) do --/ подбираем табличное соответствие if first == low then str = up..(str:sub(2) or "") --/ меняем на заглавную break end end end return str --/> end Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-763479
Nazgool 250 Опубликовано 15 Марта 2013 Поделиться Опубликовано 15 Марта 2013 (изменено) Callisto, ну это смотря с чем ты работаешь. Для чистого lua можно сменить кодировку. У меня (Win7 rus) сработала эта: s = "строка" os.setlocale("Russian_Russia.10007") -- или "Russian_Russia.10017" (Ukraine) print(s:upper()) -- СТРОКА Изменено 15 Марта 2013 пользователем Gun12 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-763681
Callisto 2 Опубликовано 15 Марта 2013 Поделиться Опубликовано 15 Марта 2013 Artos, о таком способе подумывала, но понадеялась, что есть какой-нибудь стандартный способ. Спасибо, теперь так и реализую. Gun12, Твой вариант не сработал. У меня тоже W7, но на сколько чистый Lua- не знаю Делаю скин для программы Rainmetr и штатных способов не нашла, поэтому и решила использовать скрипт. А строку получаю при парсинге страницы в интернете. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-763699
Artos 99 Опубликовано 15 Марта 2013 Поделиться Опубликовано 15 Марта 2013 Gun12 (и Callisto), данный способ со сменой локализации проходит только в двух случаях - или в систему ставится Lua-компилятор, а приложение использует или в само приложение портируется. Учитывая, что тема все же связана я игрою - оба варианта для "Сталкера" не применимы, т.к. уже имеющийся в движке сильно усеченный компилятор не "умеет локализоваться" (это инфа для модмейкеров). Ну а для "обычного приклада" - тут уже по ситуации. ИМХО, если программа "Rainmetr" ориентирована на обычного пользователя, то потребуется именно в само приложение встраивать Lua-компилятор с возможностью локализации(ий)... ну или делать встраиваемый в систему компилятор и "обучать" программу работать с ним. (овчинка выделки не стОит) Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-763748
Dennis_Chikin 3 665 Опубликовано 19 Марта 2013 Поделиться Опубликовано 19 Марта 2013 Что-то я слегка не понял эту конструrцию: if sDiv then sPattern = '[^%s%'..sDiv..']+' .. for sValue in sStr:gmatch(sPattern) do table.insert(tRet, sValue) endЕсли sDiv есть, то ЧТО у нас будет в таблице ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-764555
Nazgool 250 Опубликовано 19 Марта 2013 Поделиться Опубликовано 19 Марта 2013 (изменено) Если есть некая строка "sDiv", то шаблон "sPattern" будет иметь вид - '[^%s%'..sDiv..']+' (иначе, наверное, другой ?) В строке "sStr" будет происходить поиск всех вхождений шаблона "sPattern" Каждое найденное вхождение такого шаблона записывается в переменную "sValue" и заноситься в таблицу "tRet". Думаю что объяснение не очень. Но и вопрос не лучше. Полнее пожалуйста. Что именно не ясно? Изменено 19 Марта 2013 пользователем Gun12 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-764559
Dennis_Chikin 3 665 Опубликовано 19 Марта 2013 Поделиться Опубликовано 19 Марта 2013 (изменено) Смысл сего действа неясен. То есть, при sDiv == "," и строке ",,,,,,,,,," - получаем таблицу с 10 запятыми ? А из строки 12345,6789 получим таблицу с "12345," и "6789" ? Да, иначе там else pattern = "[_%w]+" - это как раз понятно. И вот еще тоже из той же серии. Здесь у меня вообще фантазия отказывает: for k, v in string_gfind( s, "(.*)" ) do t[k] = v end А это что должно делать ? Изменено 19 Марта 2013 пользователем Dennis_Chikin Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-764565
Nazgool 250 Опубликовано 19 Марта 2013 Поделиться Опубликовано 19 Марта 2013 (изменено) Ага. Понятно что тебе не понятно Действительно, в приведённом тобою примере смысла меньше, чем мало. Например в строке нужно найти слова, начинающиеся со строчной и заглавной буквы: local tRet = {} local sStr = "ab Ab aB AB" sPattern = '%l%S+' -- {'ab','aB'} sPattern = '%u%S+' -- {'Ab','AB'} for sValue in sStr:gmatch(sPattern) do table.insert(tRet, sValue) end Изменено 19 Марта 2013 пользователем Gun12 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-764568
Malandrinus 615 Опубликовано 19 Марта 2013 Автор Поделиться Опубликовано 19 Марта 2013 for k, v in string.gfind( s, "(.*)" ) do t[k] = v end По-моему, это лишено смысла. Если надо получить два значения из string.gfind, то в паттерне надо указать две группы, т.е. пары скобок. Здесь же имеем одну, так что v всегда будет nil. К тому же сам шаблон внутри группы ".*" по сути означает "последовательность любых символов любой длины", так что этот цикл всегда делает одну итерацию, при первой и единственной итерации возвращая в k всю строку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-764569
Nazgool 250 Опубликовано 19 Марта 2013 Поделиться Опубликовано 19 Марта 2013 (изменено) На самом деле в этом примере итерации будет две. Вроде и знаю что две, но понять почему - не могу. Где-то тут зарыто : local s = 'abc' print(s:match('^()a()b()c()$')) -- 1 2 3 4 При "gmatch"-е с шаблоном ".-" находятся места символов (не сами символы) - 4 шт. При "gmatch"-е с шаблоном ".*" находится вся строка до нуль-символа. Вот тут думаю, что эта строка находится до последнего шаблона пустых скобок перед нуль-символом. А при следующей итерации определяется и сам нуль-символ (почему-то ???). Не пойму, короче. Изменено 19 Марта 2013 пользователем Gun12 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-764572
Artos 99 Опубликовано 19 Марта 2013 Поделиться Опубликовано 19 Марта 2013 (изменено) Dennis_Chikin, задавая подобные вопросы стОит приводить не выдранные куски вода, а все взаимосвязанные... Предполагаю, что приведенное в #792 имеет отношение к этой функции: --/ Разделяем строку 'sStr' --/ опционально: [sDiv=='string'] - разделитель (при 'nil': по словам) --/ опционально: [Mode==...] - тип таблицы на выходе (nil:List|true:ToTrue|false:ToNum) function fSplitStrToTbl(sStr, sDiv, Mode, bNoErrLog) local tRet = {} local sPattern,sValue = "","" if sDiv and type(sDiv) == 'string' then --/ если divider задан: разделяем по нему sPattern = '%s*([^'..sDiv..']+)%s*' --/'[^%s%'..sDiv..']+' else --/ разделяем слова sPattern = '[%w%_]+' end if Mode == nil then --/ обычный массив for sValue in sStr:gmatch(sPattern) do table.insert(tRet, sValue) end elseif Mode == true then --/ таблица '[значение]=true' for sValue in sStr:gmatch(sPattern) do tRet[sValue] = true end elseif Mode == false then --/ таблица '[idx] = число или стринг' local iIdx = 1 for sValue in sStr:gmatch(sPattern) do tRet[iIdx] = tonumber(sValue) or sValue iIdx = iIdx +1 end end return tRet --/> end Как видно патерн, вызвавший у тебя вопрос, закоментирован(!) а рабочим является: sPattern = '%s*([^'..sDiv..']+)%s*' Т.о. исходная строка (sStr) будет разделяться по патерну, а не "из строки выделяться патерны", и в таблицу будут заноситься именно куски строк разделенные патерном, а не "Каждое найденное вхождение такого шаблона записывается в переменную "sValue" и заноситься в таблицу". Причем, в зависимости от еще одного параметра(Mode), в таблицу куски строк будут заноситься различными способами... Второй пример (с "(.*)") действительно, лишен практического смысла, о чем уже сказано выше. Изменено 19 Марта 2013 пользователем Artos Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-764574
Nazgool 250 Опубликовано 19 Марта 2013 Поделиться Опубликовано 19 Марта 2013 (изменено) Artos, буду буквоедствовать. Если бы я сказал : "Каждое найденное вхождение такой строки..." Но было сказано именно "шаблона", который, как известно, хоть и является строкой, но есть набором специальных элементов со всеми вытекающими. Кстати, а зачем объявлять локальную sValue='' в строке local sPattern,sValue = "","" ? Она и так локальна для цикла for. Изменено 19 Марта 2013 пользователем Gun12 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-764578
Dennis_Chikin 3 665 Опубликовано 19 Марта 2013 Поделиться Опубликовано 19 Марта 2013 Artos, приведенное - это amk ? Ну, как бы, я бы не стал задавать вопрос про закомментированный кусок. Очевидно, он был кем-то раскомментирован. Или взят откуда-то еще до того, как был закомменчен. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/40/#findComment-764579
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти