Функции Для Разработчиков, склад полезных функций |
Здравствуйте, гость ( Вход | Регистрация )
Функции Для Разработчиков, склад полезных функций |
6.5.2010, 1:03
Сообщение
#41
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
Как это ни странно, установка локали на русскую именно при старте скрипта не помогает (пробовал включить и в StartUp и до него отдельной строкой).
Приходится это делать в ChatArrival'е, перед применением функции string.lover(s).. (либо выносить отдельной функцией, как я выше показывал). Хотя вроде не должно бы иметь значения, переключать в начале скрипта до ЧатАрривала или перед применением. |
|
|
6.5.2010, 12:54
Сообщение
#42
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Цитата Как это ни странно, установка локали на русскую именно при старте скрипта не помогает Наверное один из нижестоящих скриптов меняет локаль обратно на "C". Дело в том, что локаль меняется глобально - для всего приложения. Поэтому не рекомендуется менять локаль в скриптах для птоки - изменив ее в одном скрипте, ты рискуешь нарушить работу всех остальных. |
|
|
6.5.2010, 16:12
Сообщение
#43
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Функции преобразования регистров:
Код function string.lower2(s) return s:gsub("([А-Я])",function(str) return string.char(str:byte()+32) end):gsub("Ё", "ё"):lower() end function string.upper2(s) return s:gsub("([а-я])",function(str) return string.char(str:byte()-32) end):gsub("ё", "Ё"):upper() end Работают быстрее, чем все аналогичные функции, выложенные ранее в этой теме. __________________________________________________ Функция экранирования "волшебных" символов регулярных выражений Lua (собственно, даже не функция, а метод): Код :gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%1") Метод необходим при использовании произвольных строк в качестве второго аргумента функций string.gsub(), string.match(), string.gmatch(). Пример: Код local result = data:gsub(str:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%1"),repl) Стоит напомнить, что в третьем аргументе функции string.gsub() необходимо экранировать символ %, иначе функция будет "съедать" этот символ, или вызывать ошибку "Invalid capture index". Экранирование производится так: Код repl:gsub("%%","%%%%")
|
|
|
6.5.2010, 20:20
Сообщение
#44
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
А чем так не устраивает установка локали?
|
|
|
6.5.2010, 20:24
Сообщение
#45
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
|
|
|
6.5.2010, 21:00
Сообщение
#46
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Единственное препятствие - это функции сохранения.
Однако это легко устраняется. Поэтому не вижу никаких препятствий в установки русской локали. |
|
|
6.5.2010, 23:33
Сообщение
#47
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
Не вижу проблему в установке локали - поставил локаль, инвертнул регистр, вернул локаль. Всё это делается в 1 микросекунду. Не понимаю, чем это может помешать остальным скриптам?
Только разве что религия не позволяет... |
|
|
7.5.2010, 4:26
Сообщение
#48
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Не вижу проблему в установке локали - поставил локаль, инвертнул регистр, вернул локаль. Только работать такая функция будет раза в 2 медленнее, чем те, что выложил я.PS. Если вам не нравятся функции, выложенные мной - используйте другие. Я выложил их в надежде, что они окажутся полезными кому-нибудь, а вовсе не для того, чтобы развязать холивар. |
|
|
18.6.2010, 2:39
Сообщение
#49
|
|
Продвинутый участник Группа: Пользователи Сообщений: 179 Регистрация: 24.2.2009 Из: Самара Пользователь №: 2 340 Спасибо сказали: 103 раза |
Анализ производительности участка кода:
Код local test_counter=0 local test_startTime=os.time() while test_startTime==os.time() do end test_startTime=os.time() while os.time()==test_startTime do test_counter=test_counter+1 [КОД_ДЛЯ_АНАЛИЗА] end return tostring(test_counter) Внутри цикла, вместо "[КОД_ДЛЯ_АНАЛИЗА]" помещаем исследуемый код, который будет выполняться в цикле ровно 1 секунду. Затем возврат переменной test_counter, в которой содержится число итераций цикла за секунду. Чем быстрее выполняется исследуемый участок кода, тем больше это число. Подсчёт количества строк в тексте (строки разделяются символом новой строки): Код function GetLinesCount(str) return #str:gsub("[^\010]","")+1 end Вернёт число строк в тексте "str", причём если строка пустая, просто 2 раза перевод строки, то будет засчитана как отдельная строка. |
|
|
28.6.2010, 2:25
Сообщение
#50
|
|
Продвинутый участник Группа: Пользователи Сообщений: 179 Регистрация: 24.2.2009 Из: Самара Пользователь №: 2 340 Спасибо сказали: 103 раза |
Имейте в виду, что...
Метод Код for i in pairs(t) do работает примерно в 6 раз медленее, чем Код for i=1,#t do Таким образом, для перебора элементов таблицы с последовательными числовыми индексами лучше пользоваться вторым способом. Ещё интересный факт. Если мы имеем строку, которую нужно преобразовать в число (строка заведомо является корректным числом), то быстрее работает метод преобразования в число проведением какой-либо математической операции, например, сложения. Таким образом, вариант: Код local str="12345" str=str+0 работает примерно в 1,8 раза быстрее, чем такой вариант: Код local str="12345" Это касается и метода tostring(n), который, хоть и совсем немного, но медленнее, чем n.."".
str=tonumber(str) |
|
|
28.6.2010, 9:01
Сообщение
#51
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
При этом функция tostring отработает корректно вне зависимости от содержимого, то есть даже если не определён метаметод __tostring, что нельзя сказать о неявном преобразовании, которое происходит при конкатенации.
Поэтому тут палка с двумя концами: либо быстродействие, либо стабильная работа скрипта. Кстати, сравнивать цикл Код for i=1,#t do и цикл Код for i in pairs(t) do как минимум не корректно, так как второй является более широким. Если уж и сравнивать, то с циклом Код for i in ipairs(t) do Кроме этого также имеет значение то, что мы делаем внутри цикла. Дело в том, что в первом цикле при обращении к элементу таблицы нам нужно будет вызывать операцию получения значения по индексу t[i]. Во втором же варианте значение автоматически возвращается вторым аргументом: Код for i,v in ipairs(t) do i - это индекс, v - это значение. Поэтому всё зависит от ситуации, в которой мы используем цикл
|
|
|
14.7.2010, 20:31
Сообщение
#52
|
|
Начинающий Группа: Пользователи Сообщений: 12 Регистрация: 15.7.2009 Пользователь №: 3 884 Спасибо сказали: 8 раз |
Сделал копию топика с другого форума чтобы можно было здесь продолжить начатое там дело.
Код function new_string_builder() local string_table = {} local object = {} function object.insert(...) for idx, str in ipairs({...}) do table.insert(string_table, idx, str) end end function object.add(...) for idx, str in ipairs({...}) do table.insert(string_table, str) end end function object.get(spliter) spliter = spliter or "" return table.concat(string_table, spliter) end function object.empty() return not next(string_table) end function object.len() local len = 0 for index, str in ipairs(string_table) do len = len + #str end return len end return object end Данная функция возвращает "объект" который используется как буфер при генерации очень большого текста составляемого из большого количества маленьких кусочков. Использование. Код buf = new_string_builder() for i = 0, 10 do buf.add(i.." ") end print(buf.get()) Результат. Код 0 1 2 3 4 5 6 7 8 9 10
|
|
|
14.7.2010, 22:44
Сообщение
#53
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Данный код годится только для старой версии lua. Для lua 5.1 нужно самому определять arg.
Код local arg = {...} Кстати да, для склада lua функций уже есть отдельная тема |
|
|
26.7.2010, 0:42
Сообщение
#54
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
ivan683, сейчас наведем порядок, в твоем посту я заменил все в соответствии с замечанием Setuper'а, если есть желание - выкладывай и те функции что были.
|
|
|
17.1.2011, 5:44
Сообщение
#55
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Оптимизированная функция Serialize:
Код function Serialize(tTable, sTableName, hFile, sTab) sTab = sTab or "" hFile:write(sTab,sTableName," = {\n") for key, value in pairs(tTable) do local sKey = (type(key) == "string") and ("[%q]"):format(key) or ("[%d]"):format(key) if type(value) == "table" then Serialize(value, sKey, hFile, sTab.."\t") else hFile:write(sTab,"\t",sKey," = ",(type(value) == "string") and ("%q"):format(value) or tostring(value)) end hFile:write(",\n") end hFile:write(sTab,"}") end Функция, выводящая содержимое таблицы в консоль: Код function table.print(tTable, sTableName, sTab, bComma) Параметр sTableName указывать не обязательно. Параметры sTab и bComma используются при рекурсивном вызове функции. Следовательно, не нужно указывать их при вызове вручную.
sTab = sTab or "" print(sTableName and sTab..sTableName.." = {" or sTab.."{") for key, value in pairs(tTable) do local sKey = (type(key) == "string") and ("[%q]"):format(key) or ("[%d]"):format(key) if type(value) == "table" then table.print(value, sKey, sTab.."\t",true) else print(sTab.."\t"..sKey.." = "..((type(value) == "string") and ("%q"):format(value) or tostring(value))..",") end end print(sTab.."}"..(bComma and "," or "")) end |
|
|
17.1.2011, 10:02
Сообщение
#56
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Вместо tprint наверное table.print ?
И если функция print стандартная lua функция, то наверное лучше в ней тоже не использовать конкатенацию, а сделать как в Serialize. То есть, вместо Код print(a..b..c..d) юзатьКод print(a, b, c, d) а на вставку табов между аргументами я думаю можно забить, хотя возможно будет кривовато отображаться
|
|
|
17.1.2011, 17:30
Сообщение
#57
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Вместо tprint наверное table.print ? ИсправилИ если функция print стандартная lua функция, то наверное лучше в ней тоже не использовать конкатенацию, а сделать как в Serialize. Оно действительно будет некрасиво отображаться. Совсем некрасиво.То есть, вместо Код print(a..b..c..d) юзатьКод print(a, b, c, d) а на вставку табов между аргументами я думаю можно забить, хотя возможно будет кривовато отображаться Поскольку функция отладочная, на оптимизацию, думаю, можно забить. |
|
|
17.1.2011, 21:01
Сообщение
#58
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Я как-то в порыве отказа от конкатенаций сделал вот такое, порой использую так же для отладки и раздаю всем для этих же целей, вот код:
Код function SerializeToString(tTable, sTableName, sTab)
local tTableConcat = {} local sTab = sTab or "" table.insert(tTableConcat, sTab) table.insert(tTableConcat, sTableName and sTableName.." = {\r\n" or "return {\r\n") for key, value in pairs(tTable) do local sKey = (type(key) == "string") and ("[%q]"):format(key) or ("[%d]"):format(key) if(type(value) == "table") then table.insert(tTableConcat, SerializeToString(value, sKey, sTab.."\t")) else local sValue = (type(value) == "string") and string.format("%q",value) or tostring(value) table.insert(tTableConcat, sTab) table.insert(tTableConcat, "\t") table.insert(tTableConcat, sKey) table.insert(tTableConcat, " = ") table.insert(tTableConcat, sValue) end table.insert(tTableConcat, ",\r\n") end table.insert(tTableConcat, sTab) table.insert(tTableConcat, "}") return table.concat(tTableConcat) end |
|
|
18.1.2011, 2:07
Сообщение
#59
|
|
Местный Группа: Неактивированные Сообщений: 908 Регистрация: 26.12.2008 Пользователь №: 1 574 Спасибо сказали: 1406 раз |
Функция преобразования кодировки cp1251 в cp866, необходимая для правильного отображения символов кириллицы в консоли Windows:
Код local CP866 = {
[160] = 255, [161] = 246, [162] = 247, [164] = 253, [168] = 240, [170] = 242, [175] = 244, [176] = 248, [178] = 73, [179] = 105, [183] = 250, [184] = 241, [185] = 252, [186] = 243, [191] = 245, } function string.tooem(str) return (str:gsub("[Ђ-я]",function(c) c = c:byte() if c >= 192 and c <= 239 then return string.char(c-64) elseif c >= 240 then return string.char(c-16) elseif CP866[c] then return string.char(CP866[c]) else return "?" end end)) end |
|
|
2.2.2011, 11:17
Сообщение
#60
|
|
Участник Группа: Пользователи Сообщений: 38 Регистрация: 26.8.2009 Пользователь №: 4 274 Спасибо сказали: 0 раз |
Если у файла в названии есть кириллица, то его имя преобразовывается в какой-то код (в магнет-ссылке) Например "мистер" в %D0%BC%D0%B8%D1%81%D1%82%D0%B5%D1%80 Нагуглил только то, что это URI Кодирование, но откуда берутся "%D0" или "%D1" не понимаю... Ну и сам вопрос: как в LUA произвести эту конвертацию? Имя файла конвертировать НЕ нужно, потому как они по умолчанию в утф8, а вот перекодировать из формата урл, можно следующей функцией: Код function unescape (s)
s = string.gsub(s, "+", " ") s = string.gsub(s, "%%(%x%x)", function (h) return string.char(tonumber(h, 16)) end) return s end |
|
|
Похожие темы
|
Сейчас: 26.12.2024, 18:02 |