myDC.ru

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

 
История благодарностей участнику ivan683. Спасибо сказали: 8
Дата поста: В теме: За сообщение: Спасибо сказали:
29.1.2014, 12:27 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Цитата(MIKHAIL @ 29.1.2014, 3:04) *
Узнать количество аргументов, принимаемых той или иной функцией, возможно?


Методом тыка: Прообуем разное количество и тип, смотрим на ошибки.

В луа не обязательно давать то число аргументов которое обьявлено в функции. Если не хватает остальные зануляются. Если перебор то откинется лишнее. Если не правильные то выдается ошибка (вернёт нуль и текст ошибки либо вылетит).


Есть функция string.dump: Ей фунцию она тебе байткод. В конце имена переменных. Следом за функционными идут локальные так что опять же метод тыка. Но это конечно работает если Lua фукция.


Фунция может также использовать перемееное количество аргументов через {...} так что с именами моожет быть накладочка.
MIKHAIL
28.1.2014, 22:17 Вопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
Цитата(MIKHAIL @ 28.1.2014, 10:25) *
Допустим, вводим переменные, которые не связаны между собой (нахождением в составе одной таблицы либо собственным именем – имя и индекс здесь для наглядности их количества) и должны быть определены уже здесь
или (где в качестве символа ! указан предполагаемый вариант оператора присваивания для всех трёх переменных):
Код
...
data1, data2, data3 = !data0
...


Код
function r(value, count)
    if count <= 0 then
        return
    else
        return value, r(value, count-1)
    end
end

local x, y, z = r(5,3)
print (x,y,z) -- 5 5 5

Alexey, Saymon21, MIKHAIL
25.9.2011, 23:48 Способы Повышения Производительности
методы оптимизации lua кода
Цитата(Setuper @ 3.1.2009, 17:02) *
[*]Большинство команд протокола NMDC оканчивается на символ "|", который служит для разделения команд, когда они находятся в одном потоке или в одной строке. Поэтому эффективнее отсылать 1 раз единую строку с командами, нежели отсылать несколько раз отдельные команды.
Код
local t = {
  "$MyINFO $ALL nick1 $ $ $ $0$",
  "$MyINFO $ALL nick2 $ $ $ $0$",
  "$MyINFO $ALL nick3 $ $ $ $0$"
}
local sStr = ""
for i, v in ipairs(t) do
  sStr = (sStr == "" and "" or sStr.."|")..v
end
Core.SendToAll(sStr)
тоже самое касается и сообщений (если вместо команд отправляются сообщения).


Ужос какой.

Код
local t = {
  "$MyINFO $ALL nick1 $ $ $ $0$",
  "$MyINFO $ALL nick2 $ $ $ $0$",
  "$MyINFO $ALL nick3 $ $ $ $0$"
}
Core.SendToAll(table.concat(t, "|"))
Alexey
25.9.2011, 21:32 Функции Для Разработчиков
склад полезных функций
[attachment=6071:serialize3.lua]Ловите монстра. ))

Собственно работает так:
Код
serialize(table, write_fnc)


С table я думаю понятно а вот write_fnc это функция которой по ходу выполнения передаются куски текста. Тем самым давая возможность оптимизировать способ его сборки.

Если результат нужно вывести в файл то делается так:
Код
local file = io.open("file_name.lua","w")
file:write("x = ")
serialize(_G, function(part) file:write(part) end)


Ну либо в сочетании со string_builder
Код
var builder = new_string_builder()
builder.add("return ")
serialize(_G, builder.add)
print(builder.get())


Ах да. Забыл сказать о преимуществах.
1 Генерирует красивый и понятный код.
2 Восстанавливает внутренние связи.
3 Проверяет особые случаи (бесконечность, -бесконечность, неопределённость).
4 Дампит функции если возможно.

P.S. совсем забыл что перед результатом деятельности этой функции надо записать либо "x=" либо "return " (Исправил примеры)

Используется мной здесь: https://github.com/ivan386/lua-dht
Alexey
2.8.2010, 22:13 Способы Повышения Производительности
методы оптимизации lua кода
В lua внутри функций можно создавать новые. Причём этим функциям доступны локальные переменные создавшей.
Это позволяет легко создавать подобие класса.

Код
function new_object()
local obj = {}

local private_var = "private"

obj.public_var = "public"

function obj.public_fnc()
  return obj.public_var
end

local function private_fnc()
  return private_var
end

return obj
end


возможен даже синглтон

Код
single_object = (function()
local obj = {}

local private_var = "private"

obj.public_var = "public"

function obj.public_fnc()
  return obj.public_var
end

local function private_fnc()
  return private_var
end

return obj
end)() -- пустая пара скобок это вызов функции созданной в первой.
Invisible
14.7.2010, 20:31 Функции Для Разработчиков
склад полезных функций
Сделал копию топика с другого форума чтобы можно было здесь продолжить начатое там дело.

Код
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
Nickolya

RSS Сейчас: 23.11.2024, 1:26