Dennis_Chikin 3 665 Опубликовано 8 Июня 2013 (изменено) Помогите, плиз, с регэкспом для string.match: "(все, что не charset)(все, что после charset)" Оно такое вообще возможно ? Пример: на входе имеем "а_вот_такая_вот_фигня_1 | и_вот_такая_2", надо получить отдельно "а_вот_такая_вот_фигня_1" и "и_вот_такая_2", но на самом деле они могут быть разделены чем угодно, и известно только то, что собственно символов разделителя в искомых подстроках нет. Ага, разделителем может быть несколько символов в любом количестве и последовательности. В подстроках могут быть вообще любые символы, кроме символов, входящих в состав разделителя. Вариант найти собственно разделитель, а потом вырезать подстроку до него, и подстроку после - очевиден, но неинтересен. Изменено 8 Июня 2013 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 8 Июня 2013 Любые - в том смысле, что не обязательно %w. В каждый момент написания регэкспа мы знаем, каких там точно быть не может. В идеале, если бы (.*)[разделитель1разделитель2разделитель3]*(.*) обрабатывалось бы как единое целое - в смысле, .* - это любые символы, кроме искомого - было бы то, что надо. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 8 Июня 2013 malandrinus, а "символы строки" определить, как противоположность "символов разделителей"Вот это и пытаюсь. Но, похоже, что-то не то делаю. Не работает. Gun12, разделители известны. Да, .* в lua работает не так, как надо мне. По логике в lua должно быть что-то типа s1, s2 = string.match( s, "([^раздедитель]*)[разделитель]*(.*)" ) ), где разделителей несколько, но оно почему-то тоже не работает. С разделителем из одного символа - работает. С одним или более из нескольких - нет. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 8 Июня 2013 (изменено) О, кажется, я понял: То есть, надо писать именно [^"строка"], а не [^символ^символ^символ] ? А конфиги трогать нельзя. Это будет оскорбление чуйств верующих. Изменено 8 Июня 2013 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 3 Мая 2014 (изменено) This question is too "wide" and unclear. It seems that You need tutorials on Your native language... Common solution would look as something like this: 1. try find out appropriate update function for appropriate object. 2. add checking code for desired weapon's section or name. 3. now, You need to store the time or the time-out if the weapon is active, or reset it to false otherwise, and disable the weapon if required. local wnp = self.object:active_weapon() if wpn and wpn:section() == "our_section" then if self.wpn_check_time then if self.wpn_check_time < self.device():time_global() then disable_wpn( self.object ) -- You MUST define this function somewhere as You need end else self.wpn_check_time = self.device():time_global() + TIME_WHAT_YOU_NEED end else self.wpn_check_time = false end Изменено 4 Мая 2014 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 4 Мая 2014 (изменено) DDamian724, It's not complete script. It's just a example. As 1-st step, You must determine to Yourself what You actually need, in details. Second, appropriate place for modification must be found and examined closely. If You mean to modify the actor - yes, function bind_stalker.update() seems to be good to be modifyed. Examine this function again: here can be something like what You want. Then, yes, consult with the "Programming in Lua" manual and make chages, one-by-one. I not see the code which You try to modify nor know version or modifications which was added before, and can't suggest details. And, yes, there is lot of methods to "disable" weapon: disable weapons completely (look bind_stalker.script for something like "self.object:hide_weapon()" or "self.weapon_hide" strings); select another active slot or item; simple release the weapon object completely; so on... Изменено 4 Мая 2014 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 17 Мая 2014 Это не Lua, а особеность эксрэя. Причем, как бы даже не ЗП-шного. Для интереса попробовать в 3-й строке не se_item:use_ai_locations(true), а опять же item:use_ai_locations(true) - что будет ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 21 Сентября 2014 Если говорить не о языке вообще, а о вполне конкретном сталкере (и конкретном ТЧ) в частности, то if not var then сработает в случае, если var == nil, var == false, а также, ВНИМАНИЕ, var - результат return без аргумента. if var == nil then сработает только тогда, когда var действительно == nil. If var then - любое var кроме случая, описанного в п1. if var == true then - только если var действительно == true. Несколько раз очень забавно нарывался на п1. 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 23 Сентября 2014 type() поможет отцам русской демократии. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 2 Января 2015 (изменено) local t = { ... } local n = #t local tt = {} local r for i = 1,5 do if n < 1 then break end r = math.random( n ) tt = t[r] table.remove( t, r ) n = n - 1 end Изменено 2 Января 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 2 Января 2015 После table.remove( t, r ) ни каких "дырок" быть не должно. Это не t[r] = nil. В общем, и во втором случае - это из серии "ну так не запрещено же, вот мы и впендюрили, чтоб вы все затрахались !" Но в первом - такое поведение - явная ошибка разработчиков конкретного компилятора. Должно быть переиндексирование. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 2 Января 2015 (изменено) а значит твой код косячит именно там где я и указал вышеТебе шашечки, или ехать ? Берем значение по индексу, и перекладываем. Всю запись удаляем. Если еще раз выпадает тот же индекс, там будет уже другое значение, которое опять же перекладывается. Что еще надо ? Не меняя качество рэндома, можно сделать только так, и ни как иначе. (Варианты только - делать непосредственно в теле кода, или отдельной функцией, как у Desertir.) Если надо, чтобы исходная таблица сохранялась тоже - либо копируем всю таблицу, либо - заводим еще одну, в формате slected[v] = true, и повторный рандом, если попали на помеченное. Больше, собственно, ни как, при имеющейся постановке задачи. P.S. А "сарказм" на самом деле относится к тому, что t = nil в сталкеровской реализации LUA таблицу просто гарантированно разрушает. Изменено 2 Января 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 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 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 19 Апреля 2015 local test_s1 = "" local test_s2 = "" local test_i = 0 function test( v ) end for i = 1, 10000 do test_s1 = test_s1 .. " " end local pt = profile_timer() pt:start() for i = 1, 10000 do test ( test_s1 ) end pt:stop() log( "info", "string 200000: %s", pt:time() ) local pt = profile_timer() pt:start() for i = 1, 10000 do test ( test_s2 ) end pt:stop() log( "info", "string 0: %s", pt:time() ) local pt = profile_timer() pt:start() for i = 1, 10000 do test ( test_i ) end pt:stop() log( "info", "int: %s", pt:time() ) string 200000: 30992.1328125 string 0: 231.48368835449 int: 216.08390808105 Таки да, действительно копирует. Прощай очередной "оптимизаторский" миф про "строки существуют только в одном экземпляре". Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 19 Апреля 2015 (изменено) 2 Desertir: только код смотреть. Адреса же нам принципиально не показывают в явном виде. Собственно, имея в виду (господи, как же это и назвать-то теперь, чтоб очередной страницы флуда не получить) - ну, вы поняли - я бы вообще сделал банально: Если что-то передается в функцию - передается адрес (у нас внутри все равно не регистровые операции, а если и регистровые, то с предварительной загрузкой из стека). То есть, пока нет присваивания - по этому адресу и получаем. Как только присваивание - создаем новую переменную, и указатель выставляем на нее. В связке с концепцией "уборки мусора" оно кажется единственно правильным, и я думал, что именно так и работает. 2 abramcumner: ожидаемо, 246 для таблицы (vs 212 и 212 для "" и 0 ). Изменено 19 Апреля 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 16 Декабря 2015 Что-то задумался: А есть ли вариант захвата типа (%b()), но для случая, когда искомых () может быть, а может и не быть (и быть что-то другое, которое и захватывать надо иначе) ? Это все к тому же вопросу об xr_logic.parse_infop() Соблазнительно разрешить в аргументах пробелы. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 16 Декабря 2015 (изменено) " +test( 34: 55 56 : 57:66 ) -test1 +test2(test0 )" Мне, пожалуйста, +, test, 34: 55 56 : 57:66 -, test1 +, test2, test0 для 2-й строки третьим захватом можно хоть nil, хоть "" - без разницы. Изменено 16 Декабря 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 17 Декабря 2015 (изменено) А проверить ? Если б работало - не спрашивал бы. В общем, я посмотрел на получающееся у меня for v1, v2, v3 in string.gfind( s, "(%S)([^%s%(%-%+%~%=%!]+)%s*%(?([^%)%-%+%~%=%!]*)%)?" ) do и понял, что лучше таки в два приема, с for v1, v2 in string.gfind( s, "(%S)([^%-%+%~%=%!]+)" ) do ...else v1, v2 = string.match( v2, "([^%s%(]+)%s*%(?([^%)]*)" ) Если v1 == "=" или "!". Так, пожалуй, все-таки и быстрее, и вменяемее. Изменено 17 Декабря 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 18 Февраля 2016 (изменено) Код странен. Я вообще не понял, что он должен делать. "RUNTIME ERROR - no static '_update' in class 'actor_binder'" - именно так, да. local s = "_" .. fn local binder = _G.bind_stalker.actor_binder local t = binder[s] if not t then t = {} binder[s] = t if narg==1 then t[1] = binder[fn] binder[fn] = function(...) for _,f in pairs ( t ) do f(...) end endbinder[fn] = function(...) - вот это вот что и зачем ?И зачем в цикле пытаться вызвать как функцию единственный элемент какой-то таблицы, который вообще то-ли есть, то-ли нет ? Изменено 18 Февраля 2016 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 3 Августа 2016 Вообще-то стоит еще понимать разницу между интерпретируемым и компилируемым кодом. И помнить, что такое инлайн, и где он есть, а где его нет. P.S. Идея копировать строки при передаче в функцию - явно не гуманности ради была реализована. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение