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

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


Malandrinus

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

Приведу пример, в котором может быть "читабельность" кого-то не устраивает, но с точки зрения корректности и оптимальности - повыше чем приведенные выше варианты:


for name,v in pairs(self.treasures) do
if not (v.done and v.active) and v.community[npc:character_community()] then
local treasure_prob = tonumber(xr_logic.pick_section_from_condlist(db.actor, npc, v.cond)) or 0
if treasure_prob > 0 then --/ тайник может быть выдан
if treasure_prob < 100 then --/ заносим в таблицу возможных для выдачи
table.insert(avail, {k=name, prob=treasure_prob})
tr_sum = tr_sum + treasure_prob
else --/ безусловная выдача тайника
self:give_treasure(name, npc)
return --/> выходим из функции, т.к. выдаем только один раз!
end
end
end
end

- примечание: код может быть еще немного оптимизирован, но это уже на любителя и конкретика для модов.

Немного об оригинальном и "читабельном" вариантах:

1.

if treasure_prob == "" or treasure_prob == nil then

- не кажется странным, вначале сравнивать переменную со строкою, а уж затем проверять на 'nil'? Логика и безопасность диктуют иной порядок...

2. Оперировать с tonumber(treasure_prob), а в таблицу 'avail' заносить без преобразования. Уж или-или, т.е. если допускать что treasure_prob может не быть числом - то зачем же в дальнейшем для 'нечисла' допускать выполнение подобного: tr_sum = tr_sum + treasure_prob? Ведь очевидно же что будет ошибка в математике!

3. При 100%-ой вероятности - выдавать тайник ( self:give_treasure(k) ) и продолжать итерацию и дальнейшие проверки? Как будто с одного непися может быть получено более одного тайника?!

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

ИМХО

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

Не кажется ли Вам моветоном засорять топик частностями, которые касаются устаревшего и удаленного функционала из актуальной версии Lua?!

Если уж очень хочется - есть топики-ковырялки... именно по игре и ее версиям, тут же - язык Lua и общие вопросы для него.

 

[x] (пост для удаления)

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

malandrinus, 'моветон' и 'криминал' - несколько различаются по смыслу, как в прочем и вопросы по луа и по игре или системе. Когда обсуждение перекинулось уже на поминание числа ядер и версий игры - посчитал возможным высказать свое мнение о неуместности засорять топик. Жаль, что мое мнение не совпало с мнением 'подразумеваемого куратора'. Собственно мой пост можно и удалить, как не совпадающее с тематикой и о чем и написано в ремарке.

Artos,

мне не кажется. ... Задача куратора - не гонять ссаными тряпками людей, задающих вопросы по смежным темам, а спокойно направлять в нужную тему в том случае, если "смежность" переходит в "совсем не в тему".

malandrinus, мой пост относился не к Вам лично, а к участникам, зашедшим в своем обсуждении слишком далеко за рамки тематики данного топика (ИМХО). Поэтому непонятно для чего пояснять именно мне или передо мною оправдывать вашу позицию, тем более высказанную достаточно грязными словами, неподходящими для подразумеваемого куратора...

Если же это не оправдание Вашей позиции, а намек на ... то попросил бы дать разъяснение и/или уточнить адресата. (можно в ЛС).

 

 

По следам былого (смежного): #18

Время показало, что правота была 'по обоим пунктам' на моей стороне. Файл lua_help.script - является просто напросто куском лог-файла со строками выведенными движком (дебаговыми бинарниками) по консольной команде 'lua_help'.

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

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

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

А подскажите кто-нибудь менее монстрообразную конструкцию для замены:

...

 

я хочу 4 числа без мусора из строки типа " -195.01,-5.12, 146.45, 50чего-то там ".

Меньшая монстрообразность выходит если не пытаться разбирать строку общего вида и подбирая под нее патерны, а исходить из уже заданных условий. Также - не пытаться все засунуть в одну строку.

Условие: Исходная строка содержит ряд только чисел, разделенных сепаратором (запятой)

В этой ситуации достаточно просто и надежно(!) получить требуемое и заодно не дать запутаться в ошибках, если таковые присутствуют в строке:

local tbl = {} --/ табличка с получаемыми числовами значениями
for s1 in string.gmatch(s, ",") do
 if tonumber(s1) then
   table.insert( tbl, tonumber(s1) )
 else
   --/ тут прерываем игру абортом или игнорируем... (по вкусу)
 end
end
local v1,v2,v3,v4 = unpack(tbl)

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

P.S. Само присутствие сепаратора в строке говорит именно о его приоритетности (разделителя на фрагменты) и зачем же мучаться, пытаясь сплошняком разбирать строку? ;-)

 

malandrinus, знак минус'а, в данном примере строки, как раз важен, т.к. в строке могут задаваться и отрицательные значения (а не экспонентного типа), поэтому и стоИт '%-?' - т.е. "если есть в начале один минус или его нет". И, конечно построенные патерны далеки от ... (я бы их не применял), и даже дальнейшее их усложнение врядли даст рабочий вариант. Малейшее отклонение от заданного формата чисел - и значение может быть считано с искажением(!) которое далее невозможно определить.

Изменено пользователем Artos
  • Нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

Zander_driver,

Судя по function ammo_cargo_space:StoF(section) - это у тебя метод 'StoF' созданного класса 'ammo_cargo_space'.

Соответственно и вызывать его требуется как к метод класса self:StoF(...) <- через двоеточие, а не как фунцию/свойство self.StoF <-через точку.

Изменено пользователем Artos
  • Нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

proger_Dencheek, твои варианты никогда не будут работать, т.к. по твоим кодам невозможны ситуации, когда aa == nil иль bb == nil истины, т.к. изначально созданные таблицы всегда существуют.

1. Попробуй заменить свои условия на if next(aa) then ... elseif next(bb) then ... , т.е. проверять 'пустоту' таблиц.

2. Если работаешь с индексированной таблицей, то и используй соответствующие ей методы: table.insert и table.remove, а не методы "по ключам"... в противном случае оператор # или будет "врать" или вообще равен 0.

 

и используй в сообщениях, плз, тэги спойлера, для портянок кодов.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

Рабочий вариант рандомного выбора из таблицы, свободный от любого повтора подряд одного и того же сообщения:

local messages = {"msg1","msg2","msg3","msg4","msg5"}
local tbl = {} --/ текущий список сообщений
local msg = "" --/ текущее (последнее) отправленное сообщение

function random_message()
  --/ проверяем наличие неотправленных сообщений
  if not next(tbl) then
   --/ возобновляем список доступых сообщений
   for _,v in ipairs(messages) do
      if v ~= msg then --/ исключаем последнее посланное
       table.insert(tbl,v) --/ добавляем в таблицу
      end
   end
  end
  --/ выбираем (одновременно удаляя из списка) рандомное сообщение
  msg = table.remove(tbl,math.random(#tbl))
  --/ отсылаем сообщение
  den.sms(msg)
end

 

 

Замысел был в не повторении сообщений по длине всего массива.

ColR_iT

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

ColR_iT, прочти в исходном вопросе #737 про "замысел": "... отсылается рандомное сообщение, но не тоже самое, другое сообщение ... если отправились все строки, все началось по новому кругу".

Т.о. алгоритм предложенный Gun12, имеет недостаток - при новом цикле возможны дубли, т.е. повтор последнего в цикле и первого в новом цикле, от которого избавлен вариант #742.

Второй недостаток - задавать таблицу 'исходных строк' в явном виде внутри функции далеко не всегда удобно или даже не всегда возможно. Если таблица имеет десятки строк да еще длиною в несколько слов... ох и кучеряво будет выглядеть ;-)

P.S. И не путай! Именно в варианте Gun12 возможен дубль по окончании старого цикла и в начале нового, что невозможно в предложенном мною, ни на третий , ни на какой другой раз.

 

proger_Dencheek, тебе даны два рабочих варианта. Если хочешь сделать 'по своему' - не нужно гадать или переусложнять. Да, массив скопируется, но для чего добавлять в таблицу с указанием на какую позицию ставить добавляемый элемент? Чтобы нарваться (теоретически) на ситуацию, когда получишь неиндексированный вариант массива?

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

Gun12,

Нет смысла в топике по общим вопросам сетовать на отсутствие в вопросах всеобъемлющих условий

;) .

Всегда найдется тот, кому тот или иной вариант не совсем годится. На то и думалка собственная, чтобы подгонять имеющиеся/предложенные ответы-варианты под собственные пожелалки.

Да и зачем зашоривать(ся) на жестком условии? Топик все же не типа "вопрос-ответ", а как обучающий и учиться нужно не только решать жестко очерченную задачу, но и ее вариации... , подгоняя под те или иные критерии.

 

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

 

 

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

Ты начинаешь путать, реализацию с "помощью языка программирования" и реализацию по "модификации самого языка" (Lua).

Конечно же можно в любой язык (имея его исходники) внести "свои" новые операторы и прочее. Но(!) это уже будет или не Lua, если ты это сделаешь "для себя", или это будет следующей версией языка, если будет принято всеми, и в первую очередь теми, кто и отвечает за развитие языка.

  • Нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

ИМХО:

local num = (math.random() > 0.5 and 10) or -(10)

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

malandrinus, сам вопрос не однозначен, хотя вроде как и тривиален, и не стал пояснять свой пост, дав в начале просто 'затравку'.

Собственно для однократного применения (вычисления), как сам Kirgudu в вопросе заметил, нет причин заморачиваться о вариациях. А от для циклов - он не дал намека на конструкцию цикла(ов).

Собственно для циклов тут три момента:

а) есть смысл непосредственно объявляя переменную, присваивать ей то или иное значение, а не за два этапа (вначале даем значение, а потом меняем знак, если ...);

б) выбор метода для наиболее правильного вычисления случайного значения (все же метод math.random грешен в тех или иных условиях, т.е. случайность не всегда "случайна");

в) способ вычисления случайного значения с использованием math.random, т.е. использование тех или иных аргументов при вызове метода.

Как и ты заметил, в игре именно вызов без аргументов (=> результат с плавающей запятой) более быстрый (проверял не раз тестами на практике), чем с заданными целочисленными аргументами. Т.е. вероятно в движке компиллятор Lua все же именно math.random() исходен, а все остальное пляшет от него, приводя к накладным расходам.

 

Вот в своем 'ИМХО' сделал упор именно на а) и в) применительно для циклов в игре, а про б) - не стал лезть в дебри. ;-)

Изменено пользователем Artos
  • Нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

Dennis_Chikin,

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

 

Во-первых, все же топик по языку Lua, а не по его интерпретации в Сталкере, поэтому в постах о тестировании следует обязательно указывать о "в чистом Lua" или в игре...

Во-вторых, не нужно выпячивать субъективные оценки без сравнительных критериев или пояснений.

 

"растет очень сильно" - то, что на перечисление бОльшего кол-ва аргументов/значений потребно бОльшее кол-во тактов/времени - это очевидно. А вот "сильно" и тем более "очень" в категоричной форме высказывать не стОит. Для кого-то пара микросекунд не играет никакой роли, а кому-то "сильно важны". Т.о. подобное - относительно!

 

"функции в несколько строк делать не надо однозначно" - если далее все одно потребно обрабатывать именно "несколько строк", то это скорее дело вкуса по оформлению кода, и ни как не относится к производительности иль оптимиизации. Т.о. "однозначность" в таких фразах недопустима, как и вообще сама "рекомендация".

 

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

 

ИМХО

 

 

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

(добавлю, чтобы развеять очередное заблуждение)

Скажем, я отказался от использования в 50 ms цикле актора чего-либо кроме "биорадара"/детектора артов.

Предполагаю, что ты просто напросто вынес соотв.коды (привязав их к коллбэку!) из самого метода апдейта актора в сторонние скрипты, но суть то осталась той же(!), т.е. все одно все твои вынесенные функции работают в том же самом цикле актора.

Чтобы вынести из цикла актора, требуется выносить в другие потоки - тогда про "освобождение" цикла актора можно что-то говорить...

Да и все одно, практически вся игра (за частичным исключением графики/рендеров/...) синхронизирована на именно (суб)цикле актора и не имеет особого смысла для оптимизации одного субцикла размазывать нагрузку по другим (хотя бы и в др.потоках), работающим в том же самом основном цикле. Для оптимизации в первую очередь требуется не "территориально" разносить, а разносить во времени.

(но это уже тема для скриптования иль ковырялок в скриптах)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

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 

 

 

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

Gun12 (и Callisto), данный способ со сменой локализации проходит только в двух случаях - или в систему ставится Lua-компилятор, а приложение использует или в само приложение портируется. Учитывая, что тема все же связана я игрою - оба варианта для "Сталкера" не применимы, т.к. уже имеющийся в движке сильно усеченный компилятор не "умеет локализоваться" (это инфа для модмейкеров).

Ну а для "обычного приклада" - тут уже по ситуации. ИМХО, если программа "Rainmetr" ориентирована на обычного пользователя, то потребуется именно в само приложение встраивать Lua-компилятор с возможностью локализации(ий)... ну или делать встраиваемый в систему компилятор и "обучать" программу работать с ним. (овчинка выделки не стОит)

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

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), в таблицу куски строк будут заноситься различными способами... 

Второй пример (с "(.*)") действительно, лишен практического смысла, о чем уже сказано выше.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

Gun12, не стОит буквоедствовать... ;-) Цель моего поста не пытаться опровергнуть твои слова или указать на их "неправильность". Просто твоя фраза имеет сильно размытый смысл. Сам посуди, как может 'найденное вхождение' шаблона (иль строки) вообще заноситься a таблицу? Строго говоря (по-буквоедски), в таблицу заносится значение чего-либо, а не вхождение.

И тут могут быть два варианта:

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

б) заносятся куски строки, разделенные каждым 'вхождением шаблона', иначе, по каждому найденному вхождению шаблона

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

 

Dennis_Chikin, нет этот код не из АМК. Он был написан мною ("по мотивам АМК"!) для Simbion'а (и в нем используется), и был опубликован и на СП в топике по моддингу, откуда мог перекочевать куда угодно...

Раскомментировать этот код нельзя, т.к. патерн (шаблон) может иметь только одно значение. Т.о. кто-то мог не подумав заменить один патерн на другой... ну или взять код из давней версии мода.

Суть получается несколько различной - рабочий вариант фильтрует повторяющиеся пробелЫ, которые могут быть в исходной строке. А "твой" вариант - жестко требует наличия одного пробела после разделителя в каждом куске строки, что критично к формату написания строк в тех же конфигах.

Иначе: строка вида: str = "1,2, 3,   4 ,5" будет рабочим вариантом шаблона разделена по каждой запятой с исключением примыкающих пробелов, а вариант указанный тобою - споткнется там, где нет или не один пробел... 

 

Примечание: В шаблон неплохо бы добавить и маску для табуляторов, т.к. в модах в конфигах не так уж редко встречаются строки с табуляторами вместо пробелов... но это пусть будет головной болью нерях-моддеров. ;-)


P.S.

Кстати, а зачем объявлять локальную sValue='' в строке  local sPattern,sValue = "","" ?

Она и так локальна для цикла for.

Согласен, что она в данном случае лишняя... как и аргумент 'bNoErrLog' на входе в функцию. Но даже текущий код в моде пока еще недоделан и был написан с учетом "на вырост"...

В вычищенном виде это может выглядеть

function fSplitStrToTbl(sStr, sDiv, Mode)
  local tRet, sPattern = {}, '[%w%_]+' --/ шаблон для разделения строки на слова
  if sDiv and type(sDiv) == 'string' then --/ если divider задан:
    sPattern = '%s*([^'..sDiv..']+)%s*' --/ разделяем по нему с фильтрацией примыкающих пробелов
  end
... 

 

 

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

Dennis_Chikin, когда использование кода идет по принципу "мне кажется" или "вроде не замечал" - нет смысла говорить о программировании, а переходить к погадалкам в темах-ковырялках. ;-)

 

1. Если ты полностью полагаешься на корректность работы движка (в том числе и пропатченного  сторонними приблудами), читающего строки конфигов - можешь использовать и упрощенные шаблоны...

Но, напоминаю, мы в теме по общим вопросам Lua, и возможности встроенного в игру кастрированного компилятора могут как учитываться, так и игнорироваться читающими сей топик.

 

2. Не путай, дефолтное чтение движком игры отдельного параметра из строки ltx-конфига действительно выполняется с игнорированием пробелов и даже табуляторов (хотя есть метод чтения 'string_wq' - "как есть").

Однако(!), в данном случае рассматриваем случай, когда движок читает ВСЮ строку (значение параметра) из конфига, отсекая только начальные и заключительные пробелы , а распарсиваешь/разделяешь на куски уже ты "сам" указанной функцией. Причем, как строка (внутри себя), так и разделители в строке могут быть самого разного наполнения (, : | \\ и даже такой:'мой разделитель' и т.д.) о которых white_spaces и не подозревают.

 

3. Читая строки лог-файла не забывай, что они могут быть далеко не теми, которые ты задаешь скриптами... И пробелы могут как заменяться, так и обрывать строку, и сами символы переводиться в low... Все зависит от способа вывода в лог и корректности выполнения самим движком (компилятором). Если в SOC сами разработчики зарубили вывод в 

лог и мы пользуемся  суррогатами - можно ли это воспринимать как некое доказательство что видишь исходное?

"Не верь глазам своим...", а доверяй написанным тобою корректным кодам. ;-)

 

4. Патерн %s в Lua (и во многих других языках) означает строгое соответствие именно пробелу, а не абы "может и табулятору". Напомню, что есть еще и '\160' - безусловный пробел, который тоже никак не отсекается сей маскою. Так что "шансов" ни каких... ежели замусорил строку всяким мусором.



P.S. Вот пример заковырки с "простеньким" конфигом: IQ-test.ltx.

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

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

@Карлан, у тебя банальная ошибка. Попробуй просто "человеческим языком" прочитать свой Lua-скрипт:

 

table.insert(aParam.key, value) - Вставить в (суб)таблицу (точнее добавить в конец) 'aParam.key' элемент 'value'.

 

- а теперь вопрос к написавшему сею строку: "А он позаботился создать эту (суб)таблицу, перед тем как в нее что-то добавлять?"

(собственно лог на это и указывает, говоря об отсутствии требуемой таблицы!)

А для твоей задумки требуется простое: aParam[key] = value - чтобы получить {key1 = value1, key2 = value2...}

 

Вот только вряд ли ты таким макаром получишь желаемое, т.к. key = math.random(100) может генерить далеко не эксклюзивные ключи и при их добавлении в {key1 = value1, key2 = value2...} у тебя уже имеющиеся будут затираться новыми...

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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


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

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