Struck 61 Опубликовано 9 Июня 2012 (изменено) Что означает сей pattern? Где прочитать про составление pattern'ов(читал printf в C языках на википедии...не особо там понятно, или я тупой) "^%s*(.-)%s*$" И что такое найденное вхождение? Изменено 9 Июня 2012 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
Struck 61 Опубликовано 9 Июня 2012 (изменено) чем тебе мануалы по Lua не угодили, что читаешь нечто в C языках? А...невнимательность, действительно - нашел, почитаю. Почитал(бегло) не нашел описания значения символов(*.$) Выяснил, что ^ означает что поиск начинаем с начала строки. Уж если тебе непонятно "найденное вхождение", то без технического переводчика (т.е. на язык чайников в технических текстах) тебе будет не просто ... ;-) Действительно...забыл погуглить Твой патерн вероятно означает (хотя зависит от метода к которому применяется): (string.gsub(str, "^%s*(.-)%s*$", "%1")) Вот мой код собственно...и из паттерна мне понятно только ^%s - эта часть.(Начинаем поиск с начала строки) Изменено 9 Июня 2012 пользователем Struck Поделиться этим сообщением Ссылка на сообщение
Struck 61 Опубликовано 10 Июня 2012 Artos, ответил бы...да флуд разжигать не хочется, код писал кстати не я, мне просто дали функцию и я хотел бы разобраться в ней. да еще для gsub Почему "да еще"...а какие паттерны для него НЕбредовые? function trim(str) return (string.gsub(str, "^%s*(.-)%s*$", "%1")) end function explode(str, sep) local pos, t = 1, {} if #sep == 0 or #str == 0 then return end for s, e in function() return string.find(str, sep, pos) end do table.insert(t, trim(string.sub(str, pos, s-1))) pos = e+1 end table.insert(t, trim(string.sub(str, pos))) return t end Поделиться этим сообщением Ссылка на сообщение
Struck 61 Опубликовано 20 Сентября 2012 (изменено) Artos, но ведь в сталкере(ТЧ по крайней мере) и есть тот самый устаревший функционал(касаемо устаревших полей в table есть foreach, foreachi и setn..да и getn я бы уже приписал), так что почему бы и не поковырять эти методы, и не дойти самому до ответа на вопрос "почему их вырезали". По сути не стоит вопрос узнать "почему их вырезали" (к слову они и не вырезаны, во всяком случае lua 5.1 прекрасно оперирует этими функция). А так походу всё и правда начинается попахивать флудом. Кидая в тему лишь догадки - ничего хорошего в итоге не получается. Считаю, что Shredder, да и не только он, решили для себя использовать или нет "устаревший" функционал языка. Для меня тема исчерпана. Пока что... ColR_iT Изменено 20 Сентября 2012 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
Struck 61 Опубликовано 20 Сентября 2014 (изменено) @AndreySol, вот накидал тебе для наглядности: t = os.clock() value = nil if value == nil then print("true") else print("false") end print('var1', os.clock() - t) if not value then print("true") else print("false") end print('var2', os.clock() - t) Возвращает: true var1 0 true var2 0 И: t = os.clock() value = false if value == nil then print("true") else print("false") end print('var1', os.clock() - t) if not value then print("true") else print("false") end print('var2', os.clock() - t) Возвращает: false var1 0 true var2 0 Неужели так трудно самому? У меня минута ушла. (Скрытый посыл: false ~= nil ) Изменено 20 Сентября 2014 пользователем Struck Поделиться этим сообщением Ссылка на сообщение
Struck 61 Опубликовано 20 Сентября 2014 @Desertir, я же написал для наглядности, пусть и время будет, разумеется что оно -> 0, но тем не менее возможно автору вопроса и на это нужен был ответ. В конкретном случае при value = nil условия проходят одинаково. Не понял. Ты хочешь еще другие случаи расписать? Удачи Поделиться этим сообщением Ссылка на сообщение
Struck 61 Опубликовано 2 Января 2015 (изменено) Подскажите более органичное решение следующей задачи: у меня есть 10 чисел (от 1 до 10 например), мне нужно рандомно получить 5 из них, причем так, что-бы ни одно не повторилось. Мне ничего изящнее в голову не пришло: local t,i,r = {},1,math.random while i<6 do local r = r(10) if not t[r] then t[r] = true; i=i+1 end end @Dennis_Chikin, лишние телодвижения с созданием индексированного массива чисел для выбора мне не нужны. Конкретно есть диапазон, и конкретно-же мне нужно выбрать из него n-ое количество неповторяющихся чисел. И у тебя код неверно будет работать: local t = { ... } --// допустим тут 1 ... 10 local n = #t --// тут 10 local tt = {] local r for i = 1,5 do if n < 1 then break end r = math.random( n ) --// вот тут и есть ошибка, можем выбрать повторяющееся значение, ты удаляешь значение, а рандом идет по индексу, можешь сам проверить tt[i] = t[r] table.remove( t, r ) n = n - 1 endТак что твой вариант точно не катит. Изменено 2 Января 2015 пользователем Struck Поделиться этим сообщением Ссылка на сообщение
Struck 61 Опубликовано 2 Января 2015 (изменено) Кхм, ну и в общем виде моя функция будет выглядеть как-то вот так. Если есть варианты лучше - предлагайте, только проверяйте на всякий случай их перед отправкой get_numbers = function(...) local t,i,r,c,m,n,list = {},0,math.random,... while i<c do local r = tonumber(n) and r(m,n) or r(m) if not t[r] then t[r] = true; i=i+1 end end if list then local tt = {} for k,_ in next,t do table.insert(tt,k) end return tt else return t end end Изменено 2 Января 2015 пользователем Kirgudu Поделиться этим сообщением Ссылка на сообщение
Struck 61 Опубликовано 2 Января 2015 (изменено) @Dennis_Chikin, переиндексирование и так есть, очевидно же. table.remove удаляет значение со сдвигом, значение может удалится по середине, а индекс по-любому с конца. "ну так не запрещено же, вот мы и впендюрили, чтоб вы все затрахались !"Порой я твой сарказм не понимаю. "Дырок" там конечно же нет, это тоже очевидно. Вот тебе нагляднейший пример: t={} for i=1,10 do table.insert(t,i) end print("ONE:") for k,v in pairs(t) do print(k.."="..v) end table.remove(t,t[6]) print("TWO:") for k,v in pairs(t) do print(k.."="..v) endНа выходе: ONE: 1=1 2=2 3=3 4=4 5=5 6=6 7=7 8=8 9=9 10=10 TWO: 1=1 2=2 3=3 4=4 5=5 6=7 7=8 8=9 9=10 Переиндексация идет, а значит твой код косячит именно там где я и указал выше, сейчас лишь только доказал это эмпирически Изменено 2 Января 2015 пользователем Struck Поделиться этим сообщением Ссылка на сообщение
Struck 61 Опубликовано 2 Января 2015 @Nazgool, именно то, что я хотел сделать, но не сообразил как, спасибо. Только в функции t на tab надобно поменять. @Dennis_Chikin, извини, тупанул. Поделиться этим сообщением Ссылка на сообщение
Struck 61 Опубликовано 30 Января 2016 @RayTwitty, обычный синтаксический сахар не покатит? local function call_string(obj, method, ...) return obj[method](obj, ...) end Поделиться этим сообщением Ссылка на сообщение
Struck 61 Опубликовано 31 Января 2016 @RayTwitty, пробуй: function my_pairs (t) local a = {} for n in pairs(t) do a[#a + 1] = n end table.sort(a) local i = 0 return function() i = i + 1 return a[i], t[a[i]] end end local ex = {["b"] = 1, ["e"] = 2, ["c"] = 3} for name in my_pairs(ex) do print(name) end Поделиться этим сообщением Ссылка на сообщение