myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему

> Функции Для Разработчиков, склад полезных функций

Ksan
сообщение 6.5.2010, 1:03
Сообщение #41


Белый Волк
*********

Группа: Пользователи
Сообщений: 1 723
Регистрация: 11.9.2008
Из: г.Томск
Пользователь №: 516
Спасибо сказали: 657 раз




Как это ни странно, установка локали на русскую именно при старте скрипта не помогает (пробовал включить и в StartUp и до него отдельной строкой).
Приходится это делать в ChatArrival'е, перед применением функции string.lover(s).. (либо выносить отдельной функцией, как я выше показывал).
Хотя вроде не должно бы иметь значения, переключать в начале скрипта до ЧатАрривала или перед применением.
Go to the top of the page
+Quote Post
alex82
сообщение 6.5.2010, 12:54
Сообщение #42


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Цитата
Как это ни странно, установка локали на русскую именно при старте скрипта не помогает


Наверное один из нижестоящих скриптов меняет локаль обратно на "C". Дело в том, что локаль меняется глобально - для всего приложения. Поэтому не рекомендуется менять локаль в скриптах для птоки - изменив ее в одном скрипте, ты рискуешь нарушить работу всех остальных.
Go to the top of the page
+Quote Post
alex82
сообщение 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("%%","%%%%")


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 6.5.2010, 20:20
Сообщение #44


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




А чем так не устраивает установка локали?
Go to the top of the page
+Quote Post
alex82
сообщение 6.5.2010, 20:24
Сообщение #45


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Setuper

http://mydc.ru/index.html?showtopic=334&am...ost&p=30144
Go to the top of the page
+Quote Post
Setuper
сообщение 6.5.2010, 21:00
Сообщение #46


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Единственное препятствие - это функции сохранения.
Однако это легко устраняется.

Поэтому не вижу никаких препятствий в установки русской локали.


Спасибо сказали:
Go to the top of the page
+Quote Post
Ksan
сообщение 6.5.2010, 23:33
Сообщение #47


Белый Волк
*********

Группа: Пользователи
Сообщений: 1 723
Регистрация: 11.9.2008
Из: г.Томск
Пользователь №: 516
Спасибо сказали: 657 раз




Не вижу проблему в установке локали - поставил локаль, инвертнул регистр, вернул локаль. Всё это делается в 1 микросекунду. Не понимаю, чем это может помешать остальным скриптам?
Только разве что религия не позволяет...
Go to the top of the page
+Quote Post
alex82
сообщение 7.5.2010, 4:26
Сообщение #48


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Цитата(Ksan @ 6.5.2010, 23:33) *
Не вижу проблему в установке локали - поставил локаль, инвертнул регистр, вернул локаль.
Только работать такая функция будет раза в 2 медленнее, чем те, что выложил я.

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


Спасибо сказали:
Go to the top of the page
+Quote Post
Phazeus
сообщение 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 раза перевод строки, то будет засчитана как отдельная строка.


Спасибо сказали:
Go to the top of the page
+Quote Post
Phazeus
сообщение 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"
str=tonumber(str)
Это касается и метода tostring(n), который, хоть и совсем немного, но медленнее, чем n.."".
Go to the top of the page
+Quote Post
Setuper
сообщение 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 - это значение. Поэтому всё зависит от ситуации, в которой мы используем цикл big_smile.gif
Go to the top of the page
+Quote Post
ivan683
сообщение 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


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 14.7.2010, 22:44
Сообщение #53


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Данный код годится только для старой версии lua. Для lua 5.1 нужно самому определять arg.
Код
local arg = {...}


Кстати да, для склада lua функций уже есть отдельная тема
Go to the top of the page
+Quote Post
Nickolya
сообщение 26.7.2010, 0:42
Сообщение #54


Главный ра******й тут...
*********

Группа: Главные администраторы
Сообщений: 1 727
Регистрация: 18.5.2008
Из: RF, 2la
Пользователь №: 1
Спасибо сказали: 776 раз




ivan683, сейчас наведем порядок, в твоем посту я заменил все в соответствии с замечанием Setuper'а, если есть желание - выкладывай и те функции что были.
Go to the top of the page
+Quote Post
alex82
сообщение 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)
    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
Параметр sTableName указывать не обязательно. Параметры sTab и bComma используются при рекурсивном вызове функции. Следовательно, не нужно указывать их при вызове вручную.


Спасибо сказали:
Go to the top of the page
+Quote Post
Setuper
сообщение 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)
а на вставку табов между аргументами я думаю можно забить, хотя возможно будет кривовато отображаться big_smile.gif


Спасибо сказали:
Go to the top of the page
+Quote Post
alex82
сообщение 17.1.2011, 17:30
Сообщение #57


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Цитата(Setuper @ 17.1.2011, 9:02) *
Вместо tprint наверное table.print ?
Исправил
Цитата(Setuper @ 17.1.2011, 9:02) *
И если функция print стандартная lua функция, то наверное лучше в ней тоже не использовать конкатенацию, а сделать как в Serialize.
То есть, вместо
Код
print(a..b..c..d)
юзать
Код
print(a, b, c, d)
а на вставку табов между аргументами я думаю можно забить, хотя возможно будет кривовато отображаться big_smile.gif
Оно действительно будет некрасиво отображаться. Совсем некрасиво.

Поскольку функция отладочная, на оптимизацию, думаю, можно забить.
Go to the top of the page
+Quote Post
Nickolya
сообщение 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


Спасибо сказали:
Go to the top of the page
+Quote Post
alex82
сообщение 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


Спасибо сказали:
Go to the top of the page
+Quote Post
alcorp
сообщение 2.2.2011, 11:17
Сообщение #60


Участник
**

Группа: Пользователи
Сообщений: 38
Регистрация: 26.8.2009
Пользователь №: 4 274
Спасибо сказали: 0 раз




Цитата(Serx @ 25.2.2010, 22:03) *
Если у файла в названии есть кириллица, то его имя преобразовывается в какой-то код (в магнет-ссылке)
Например "мистер" в %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
Go to the top of the page
+Quote Post

4 страниц V  < 1 2 3 4 >
Ответить в данную темуНачать новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts Вопрос по функции
0 000000 4 515 7.1.2018, 12:55 Посл. сообщение: 000000
No new От: Функции Для Разработчиков
От темы с ID: 334
19 Nickolya 19 192 22.2.2014, 15:22 Посл. сообщение: Ksan
No New Posts От: Вызов функции без возврата
От темы с ID: 4632
1 LoT 5 943 3.2.2011, 8:08 Посл. сообщение: ScOol
No New Posts Вызов функции без возврата
1 dimajak 7 889 1.2.2011, 2:55 Посл. сообщение: Ksan
No New Posts ВАЖНО: Topic has attachmentsФункции ===> Читаем, Дабы Не Задавать Вопросов <===
Скрипт-интерфейс PtokaX Lua. ВСЕ СКРИПТОВЫЕ ФУНКЦИИ PtokaX API
6 Svyat 37 530 11.10.2010, 15:50 Посл. сообщение: Nickolya
No New Posts Общие функции
хочется меньше писанины и больше скорости
1 RAND(i)M 6 263 9.9.2010, 0:01 Посл. сообщение: alex82
Closed ВАЖНО: Topic has attachmentsLua Api Функции Hex Хаба
Описание функций
1 Jaska 10 725 22.6.2010, 22:07 Посл. сообщение: Saymon21
No new Topic has attachmentsИщу разработчиков ADC Хабов
обменяться мнениями.
28 SysMan 39 482 9.4.2010, 10:16 Посл. сообщение: Delion
No New Posts От: Функции ===> Читаем, Дабы Не Задавать Вопросов <===
От темы с ID: 118
1 Setuper 6 554 20.2.2010, 22:54 Посл. сообщение: _Герой_
Moved Ищу разработчиков ADC Хабов
обменяться мнениями.
0 SysMan 0 3.7.2009, 19:57 Посл. сообщение: SysMan
No New Posts Topic has attachmentsLua Api Функции Hex Хаба
Описание функций
3 Setuper 9 141 3.6.2009, 18:31 Посл. сообщение: Jaska
No New Posts Защта от функции грейлинка
Как обезопасить себя и хаб
2 valdis73 7 588 25.4.2009, 17:55 Посл. сообщение: valdis73
No New Posts Функции Irc бота
Написать функции
1 zangriEBP 7 053 25.4.2009, 10:48 Посл. сообщение: zangriEBP
No New Posts От: Функции ===> Читаем, Дабы Не Задавать Вопросов <===
От темы с ID: 118
1 MEXAHuK 6 467 27.1.2009, 19:32 Посл. сообщение: MEXAHuK
No New Posts От: Функции
От темы с ID: 118
9 Wariner 14 091 26.11.2008, 16:00 Посл. сообщение: Setuper

 



RSS Сейчас: 26.12.2024, 18:02