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

35 страниц V  1 2 3 > »   
Ответить в эту темуОткрыть новую тему
> Помогите освоить LUA
sutra
сообщение 24.10.2018, 18:09
Сообщение #1


******

Expert
Сообщений: 669
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 598
Пользователь №: 19.007



Начал осваивать LUA, помогите пожалуйста, в справке нет многих операторов.
Сразу возник вопрос, как загрузить массив из файла (аналог load_array), наверняка ответ на форуме есть, но я не нашёл. В обычном скрипте код такой.

load_array %cfg $ConfigFile

Ну и сохранить соответственно тоже не знаю как.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 25.10.2018, 1:58
Сообщение #2


**********

Elder
Сообщений: 2.606
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 16187
Пользователь №: 16.971
Возраст: 29



чтение/запись файла
Код
--lua
log "clear"  log "mode compact"
local f = io.open([[C:\111.txt]], "r")  -- открыть файл для чтения

if f then    -- если файл открылся
    local cfg = {}    -- объявили массив
    for v in f:lines() do       -- читаем файл 111.txt по строкам
        cfg[#cfg+1]=v           -- добавляем в массив
    end
    f:close();   -- закрыть файл
    log(table.concat(cfg, " "))    -- вывести массив в лог

    for i=1, #cfg do         -- для всех элементов массива
        cfg[i]=tostring(i) .. " " .. cfg[i]  -- вначале строки добавим номер строки
    end

    f = io.open([[C:\222.txt]], "w")  -- открыть файл для записи
    if f then
        for i=1, #cfg do         -- для всех элементов массива
            f:write(cfg[i] .. "\r\n")  -- запись в файл
        end
        f:close();   -- закрыть файл
    end
end
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 25.10.2018, 8:43
Сообщение #3


***********

Модератор UOPilot
Сообщений: 8.364
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 25851
Пользователь №: 11.279



Поскольку lua весь на деревьях и размеры массивов могут быть различными даже в части вложенности элементов (они не прямоугольные в lua), то лучше использовать что-то более серьезное, хотя в базовом виде работать бесспроно будет.
Например есть вот такое творение:
http://lua-users.org/wiki/TablePersistence
оригинал

Код
local write, writeIndent, writers, refCount;

persistence =
{
    store = function (path, ...)
        local file, e = io.open(path, "w");
        if not file then
            return error(e);
        end
        local n = select("#", ...);
        -- Count references
        local objRefCount = {}; -- Stores reference that will be exported
        for i = 1, n do
            refCount(objRefCount, (select(i,...)));
        end;
        -- Export Objects with more than one ref and assign name
        -- First, create empty tables for each
        local objRefNames = {};
        local objRefIdx = 0;
        file:write("-- Persistent Data\n");
        file:write("local multiRefObjects = {\n");
        for obj, count in pairs(objRefCount) do
            if count > 1 then
                objRefIdx = objRefIdx + 1;
                objRefNames[obj] = objRefIdx;
                file:write("{};"); -- table objRefIdx
            end;
        end;
        file:write("\n} -- multiRefObjects\n");
        -- Then fill them (this requires all empty multiRefObjects to exist)
        for obj, idx in pairs(objRefNames) do
            for k, v in pairs(obj) do
                file:write("multiRefObjects["..idx.."][");
                write(file, k, 0, objRefNames);
                file:write("] = ");
                write(file, v, 0, objRefNames);
                file:write(";\n");
            end;
        end;
        -- Create the remaining objects
        for i = 1, n do
            file:write("local ".."obj"..i.." = ");
            write(file, (select(i,...)), 0, objRefNames);
            file:write("\n");
        end
        -- Return them
        if n > 0 then
            file:write("return obj1");
            for i = 2, n do
                file:write(" ,obj"..i);
            end;
            file:write("\n");
        else
            file:write("return\n");
        end;
        if type(path) == "string" then
            file:close();
        end;
    end;

    load = function (path)
        local f, e;
        if type(path) == "string" then
            f, e = loadfile(path);
        else
            f, e = path:read('*a')
        end
        if f then
            return f();
        else
            return nil, e;
        end;
    end;
}

-- Private methods

-- write thing (dispatcher)
write = function (file, item, level, objRefNames)
    writers[type(item)](file, item, level, objRefNames);
end;

-- write indent
writeIndent = function (file, level)
    for i = 1, level do
        file:write("\t");
    end;
end;

-- recursively count references
refCount = function (objRefCount, item)
    -- only count reference types (tables)
    if type(item) == "table" then
        -- Increase ref count
        if objRefCount[item] then
            objRefCount[item] = objRefCount[item] + 1;
        else
            objRefCount[item] = 1;
            -- If first encounter, traverse
            for k, v in pairs(item) do
                refCount(objRefCount, k);
                refCount(objRefCount, v);
            end;
        end;
    end;
end;

-- Format items for the purpose of restoring
writers = {
    ["nil"] = function (file, item)
            file:write("nil");
        end;
    ["number"] = function (file, item)
            file:write(tostring(item));
        end;
    ["string"] = function (file, item)
            file:write(string.format("%q", item));
        end;
    ["boolean"] = function (file, item)
            if item then
                file:write("true");
            else
                file:write("false");
            end
        end;
    ["table"] = function (file, item, level, objRefNames)
            local refIdx = objRefNames[item];
            if refIdx then
                -- Table with multiple references
                file:write("multiRefObjects["..refIdx.."]");
            else
                -- Single use table
                file:write("{\n");
                for k, v in pairs(item) do
                    writeIndent(file, level+1);
                    file:write("[");
                    write(file, k, level+1, objRefNames);
                    file:write("] = ");
                    write(file, v, level+1, objRefNames);
                    file:write(";\n");
                end
                writeIndent(file, level);
                file:write("}");
            end;
        end;
    ["function"] = function (file, item)
            -- Does only work for "normal" functions, not those
            -- with upvalues or c functions
            local dInfo = debug.getinfo(item, "uS");
            if dInfo.nups > 0 then
                file:write("nil --[[functions with upvalue not supported]]");
            elseif dInfo.what ~= "Lua" then
                file:write("nil --[[non-lua function not supported]]");
            else
                local r, s = pcall(string.dump,item);
                if r then
                    file:write(string.format("loadstring(%q)", s));
                else
                    file:write("nil --[[function could not be dumped]]");
                end
            end
        end;
    ["thread"] = function (file, item)
            file:write("nil --[[thread]]\n");
        end;
    ["userdata"] = function (file, item)
            file:write("nil --[[userdata]]\n");
        end;
}

Пример использования:
Код
t_original = {1, 2, ["a"] = "string", b = "test", {"subtable", [4] = 2}};
persistence.store("storage.lua", t_original);
t_restored = persistence.load("storage.lua");

Это позволит сохранят таблицы с любой структурой при этом сохраненный файл является полностью валидным lua кодом и может быть загружен через loadstring (что на самом деле и делает функция persistence.load). Вид при этом читабельный, никаких дурных проблем с зарезервированными символами и т.д.

Почему для себя я бы не стал это использовать... Сделано оно так, что должно находиться в коде скрита, а не подгружаться из отдельного файла. Это просто не удобно. К тому же мы получаем километровое название функции которое еще и правильно нужно написать. Поэтому для себя я сделал небольшие модификации.
Допиленный вариант
Код

local write, writeIndent, writers, refCount;

local persistence =
{
    save = function (path, ...)
        local file, e = io.open(path, "w");
        if not file then
            return error(e);
        end
        local n = select("#", ...);
        -- Count references
        local objRefCount = {}; -- Stores reference that will be exported
        for i = 1, n do
            refCount(objRefCount, (select(i,...)));
        end;
        -- Export Objects with more than one ref and assign name
        -- First, create empty tables for each
        local objRefNames = {};
        local objRefIdx = 0;
        file:write("-- Persistent Data\n");
        file:write("local multiRefObjects = {\n");
        for obj, count in pairs(objRefCount) do
            if count > 1 then
                objRefIdx = objRefIdx + 1;
                objRefNames[obj] = objRefIdx;
                file:write("{};"); -- table objRefIdx
            end;
        end;
        file:write("\n} -- multiRefObjects\n");
        -- Then fill them (this requires all empty multiRefObjects to exist)
        for obj, idx in pairs(objRefNames) do
            for k, v in pairs(obj) do
                file:write("multiRefObjects["..idx.."][");
                write(file, k, 0, objRefNames);
                file:write("] = ");
                write(file, v, 0, objRefNames);
                file:write(";\n");
            end;
        end;
        -- Create the remaining objects
        for i = 1, n do
            file:write("local ".."obj"..i.." = ");
            write(file, (select(i,...)), 0, objRefNames);
            file:write("\n");
        end
        -- Return them
        if n > 0 then
            file:write("return obj1");
            for i = 2, n do
                file:write(" ,obj"..i);
            end;
            file:write("\n");
        else
            file:write("return\n");
        end;
        if type(path) == "string" then
            file:close();
        end;
    end;

    load = function (path)
        local f, e;
        if type(path) == "string" then
            f, e = loadfile(path);
        else
            f, e = path:read('*a')
        end
        if f then
            return f();
        else
            return nil, e;
        end;
    end;
}

-- Private methods

-- write thing (dispatcher)
write = function (file, item, level, objRefNames)
    writers[type(item)](file, item, level, objRefNames);
end;

-- write indent
writeIndent = function (file, level)
    for i = 1, level do
        file:write("\t");
    end;
end;

-- recursively count references
refCount = function (objRefCount, item)
    -- only count reference types (tables)
    if type(item) == "table" then
        -- Increase ref count
        if objRefCount[item] then
            objRefCount[item] = objRefCount[item] + 1;
        else
            objRefCount[item] = 1;
            -- If first encounter, traverse
            for k, v in pairs(item) do
                refCount(objRefCount, k);
                refCount(objRefCount, v);
            end;
        end;
    end;
end;

-- Format items for the purpose of restoring
writers = {
    ["nil"] = function (file, item)
            file:write("nil");
        end;
    ["number"] = function (file, item)
            file:write(tostring(item));
        end;
    ["string"] = function (file, item)
            file:write(string.format("%q", item));
        end;
    ["boolean"] = function (file, item)
            if item then
                file:write("true");
            else
                file:write("false");
            end
        end;
    ["table"] = function (file, item, level, objRefNames)
            local refIdx = objRefNames[item];
            if refIdx then
                -- Table with multiple references
                file:write("multiRefObjects["..refIdx.."]");
            else
                -- Single use table
                file:write("{\n");
                for k, v in pairs(item) do
                    writeIndent(file, level+1);
                    file:write("[");
                    write(file, k, level+1, objRefNames);
                    file:write("] = ");
                    write(file, v, level+1, objRefNames);
                    file:write(";\n");
                end
                writeIndent(file, level);
                file:write("}");
            end;
        end;
    ["function"] = function (file, item)
            -- Does only work for "normal" functions, not those
            -- with upvalues or c functions
            local dInfo = debug.getinfo(item, "uS");
            if dInfo.nups > 0 then
                file:write("nil --[[functions with upvalue not supported]]");
            elseif dInfo.what ~= "Lua" then
                file:write("nil --[[non-lua function not supported]]");
            else
                local r, s = pcall(string.dump,item);
                if r then
                    file:write(string.format("loadstring(%q)", s));
                else
                    file:write("nil --[[function could not be dumped]]");
                end
            end
        end;
    ["thread"] = function (file, item)
            file:write("nil --[[thread]]\n");
        end;
    ["userdata"] = function (file, item)
            file:write("nil --[[userdata]]\n");
        end;
}

return persistence

Пример использования:
Код
local tableToFile = require[[luaPlugins\tableToFile]] -- объявляется один раз в начале скрипта.
-- Объявляем массив
local arr = {10,9,8,7,6,5,4,3,{21,22,23,"'}\"\t\'",{}},1,0}
-- Сохраняем массив
tableToFile.save("1.txt",arr)
-- Закгружаем массив
arr2=tableToFile.load("1.txt")

Изменения оригинального кода - минимальные. Просто теперь можно спокойно подгрузить одной строкой, а не таскать весь код каждый раз за собой. Ну и store нам save поменял.


--------------------
Скрипты под заказ.
Консультации по UOpilot через ICQ, Skype, Ventrilo, TeamSpeak, TeamViewer 700р/час.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 25.10.2018, 8:54
Сообщение #4


***********

Модератор UOPilot
Сообщений: 8.364
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 25851
Пользователь №: 11.279



Предчувствуя следующий вопрос:
Отобразить содержимое таблицы
Код
local function lg(data, comment)
    if  comment ~= nil then
        log(comment)
    end
    
    local tab = ""
    local deep = 0
    
    local function show(data)
        -- Пишем в лог комментарий.
        deep = deep + 1 -- Уровень вложенности вызовов функции.

        if type(data) == "table"    then
            local element_counter = 0
            for k,v in pairs(data) do
                element_counter = element_counter + 1
                if  type (v) == "table" then
                    log(tab..'table: '..k)
                    tab = tab .. "    "
                    show(v)
                    tab = string.sub(tab, 1, -5)
                else
                    if     type(v) == "nil"       then v = "nil"
                    elseif type(v) == "string"    then v = '"' .. v .. '"'
                    elseif type(v) == "number"    then v = tostring(v)
                    elseif type(v) == "function"  then v = tostring(v)
                    elseif type(v) == "thread"    then v = tostring(v)
                    elseif type(v) == "userdata"  then v = "userdata"
                    elseif type(v) == "boolean"   then v = tostring(v)
                    elseif type(v) == "table"     then
                        log(tab..""..k.." = "..v or "nil")
                    else
                        v = "uknown data type"
                    end
                    log(tab..""..k.." = " .. v)
                end
            end    
            log("Elements in table: " .. element_counter)
        else
            log('table is "' .. type(data) .. '" data type. Value: ' .. tostring(data))
        end
        -- Пишем в лог комментарий.
        deep = deep - 1 -- Уровень вложенности вызовов функции.
    end
    
    show(data)
end

Выдернуто куском из кода, там чуть лишнего есть. Использование:
lg(table, "комментарий")
Комментарий можно не писать.

Сообщение отредактировал DarkMaster - 26.10.2018, 1:01


--------------------
Скрипты под заказ.
Консультации по UOpilot через ICQ, Skype, Ventrilo, TeamSpeak, TeamViewer 700р/час.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 25.10.2018, 23:06
Сообщение #5


******

Expert
Сообщений: 669
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 598
Пользователь №: 19.007



Спасибо большое парни! Оба здорово помогли мне. Сделал средний вариант, не так сложно как у Дарка, но с поддержкой двумерных строково-числовых массивов. И на будущее ещё много чего понял. Ещё раз спасибо.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 26.10.2018, 0:36
Сообщение #6


***********

Модератор UOPilot
Сообщений: 8.364
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 25851
Пользователь №: 11.279



Цитата
Сделал средний вариант, не так сложно как у Дарка

Смысл в том, что это делать уже не надо - оно уже сделано. Достаточно просто подключить. В итоге получается обыкновенная функция, а что там внутри наворочено вам и не нужно знать по большому счету.


--------------------
Скрипты под заказ.
Консультации по UOpilot через ICQ, Skype, Ventrilo, TeamSpeak, TeamViewer 700р/час.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 26.10.2018, 12:28
Сообщение #7


******

Expert
Сообщений: 669
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 598
Пользователь №: 19.007



Дарк, а есть такая возможность получить некий результат в виде переменной из скрипта Lua в обычный скрипт? Или только через файл. Замечание я принял, спасибо. Но я всё люблю попробовать сам и понять как это работает, так сказать на всякий случай, в целях самообразования. Просто читаешь иногда посты, там говорят что мол это невозможно, а начинаешь пробовать и всё получается. Вот не помню уж где-то видел, что нельзя анализировать звук, а я анализирую без проблем.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 26.10.2018, 14:25
Сообщение #8


***********

Модератор UOPilot
Сообщений: 8.364
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 25851
Пользователь №: 11.279



Цитата
Дарк, а есть такая возможность получить некий результат в виде переменной из скрипта Lua в обычный скрипт?

Нет. И подозреваю, что даже между запущенными на луа скриптами будет определенная проблема передать данные. Изначально там была глобальная область видимости для глобальных переменных, т.е.
local a = 10 -- видно в пределах вкладки
a = 10 -- видно из любой. Но т.к. это приводило к катастрофам - все было разделено.
Так что только файликами. В луа думаю можно поискать дллки чтобы с ком портами работать, но в стандартном синтаксисе это только плагин писать либо какими-то невероятным костылями со сторонними exe, и может буфером.

Про звук поделиться не хотите?


--------------------
Скрипты под заказ.
Консультации по UOpilot через ICQ, Skype, Ventrilo, TeamSpeak, TeamViewer 700р/час.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
WKnight
сообщение 26.10.2018, 14:35
Сообщение #9


********

Разработчик UO Pilot'а
Сообщений: 1.632
Регистрация: 9.1.2006
Группа: Модераторы
Наличность: 7164
Пользователь №: 4.688



Цитата
а есть такая возможность получить некий результат в виде переменной из скрипта Lua в обычный скрипт?

Теоретически есть. А смысл?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 26.10.2018, 15:53
Сообщение #10


******

Expert
Сообщений: 669
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 598
Пользователь №: 19.007



Смысла нет, просто скрипт огромный, хотел частями попробовать, так что проехали.

А про звук ... Ну программер из меня хреновый, а вот придумывать я мастак. Сначала хотел всё делать "по уму", но как я уже сказал, программер из меня... Поэтому сделал просто. Вывожу микшер куда мне надо (засунул на второй монитор в самый низ). А потом всё тем же Файндом просто контролирую шкалу громкости. Как минимум длительность звука и его пиковые пороги контролировать элементарно. Теоретически можно и синусоиду контролировать, тогда нужно чтобы постоянно висела какая-нибудь программулина, но это уж точно изврат.

Файнды - ЭТО СИЛА. Думаю в Lua всё будет "летать" и я никаких проблем и ограничений для себя не вижу. Ещё раз спасибо Кнайту. Несмотряна то, что я нищий, если заведу себе яндекс деньги, то отблагодарю.

С одним монитором в полноэкранном режиме естественно не прокатит. А меня вполне устраивает. А по уму надо как я понимаю плагин прикручивать. Только как вытащить туда звуки системы я не знаю, но теоретически однозначно можно. Микшер то вытаскивает ...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 26.10.2018, 16:49
Сообщение #11


******

Expert
Сообщений: 669
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 598
Пользователь №: 19.007



В башке "месиво" сплошное от всех этих языков, тяжко продвигается. То set поставлю, то вместо "==" одиночное "=", то then забуду. Залез тут как-то в Делфи, про begin-ы и точки с запятыми забываю, ну там быстро напоминают, ещё до компиляции. Никаких стандартов, каждый норовит своё придумать, ладно хоть Escape у всех одинаково работает, а вот уже с Enter-ом проблемы встречаются. По уму должны перевод строки приклеивать, но это не факт.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
olduo.com
сообщение 27.10.2018, 0:51
Сообщение #12


*****

Journeyman
Сообщений: 336
Регистрация: 31.7.2016
Группа: Пользователи
Наличность: 0
Пользователь №: 18.060



Цитата(sutra @ 26.10.2018, 16:49) *

В башке "месиво" сплошное от всех этих языков, тяжко продвигается. То set поставлю, то вместо "==" одиночное "=", то then забуду. Залез тут как-то в Делфи, про begin-ы и точки с запятыми забываю, ну там быстро напоминают, ещё до компиляции.

проблема в том, что твое месиво в башке ты не знаешь углубленно =)
не забывай ставить ; в луа, это удобно если не знаешь на чем будешь кодить завтра =) из личного опыта)
а так луа это школьный язык, его там нужно вместо паскаля и бесика преподавать)


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 27.10.2018, 1:59
Сообщение #13


***********

Модератор UOPilot
Сообщений: 8.364
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 25851
Пользователь №: 11.279



Цитата
а так луа это школьный язык, его там нужно вместо паскаля и бесика преподавать)

И да и нет. Пока не лезешь в классы и метатаблицы - да. И вопрос не в том, что это что-то невероятно сложное, тут скорее проблема читаемости и понимания структуры кода. В рамках луа, который гибкий просто до безобразия в свой функциональщине, считаю использование классов нежеланием переучиваться плюсовиков.


--------------------
Скрипты под заказ.
Консультации по UOpilot через ICQ, Skype, Ventrilo, TeamSpeak, TeamViewer 700р/час.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 27.10.2018, 12:44
Сообщение #14


*******

Adept
Сообщений: 1.070
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 12209
Пользователь №: 16.156



Цитата
считаю использование классов нежеланием переучиваться плюсовиков.


Да вот только сам по себе луа пустой. Его сфера применение - встраивание. И как бы если луа может реализовывать классы, то не факт что те же плюсы смогут реализовать фичи луа (имеется ввиду из коробки). Да и к тому же, есть устоя́вшиеся нормы и правила написания софта. Класс - удобно, красиво, хоть иногда и громоздко. А луа сегодня есть, завтра нет...отсюда как бы еще и вытекает вопрос а зачем собственно и переучиваться на луа и вникать в него, если он не востребован практически нигде(по сравнению с питоном, js и другими) ?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 27.10.2018, 14:00
Сообщение #15


***********

Модератор UOPilot
Сообщений: 8.364
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 25851
Пользователь №: 11.279



Цитата
Да вот только сам по себе луа пустой.

Классы этого никак не меняют.
Цитата
Его сфера применение - встраивание.

И справляется на самом деле очень неплохо. Тем не менее есть те же сокеты, биндинги под wxWidgets и Qt. Т.е. на нем пишут. Его распространненость скорее следствие работы не шибко большой группы и отсутствия макетинга. Это не Google который штампует языки и на них _будут_ писать вне зависимости от качества продукта.
Цитата
Класс - удобно, красиво, хоть иногда и громоздко.

Тут холивар может быть очень большим. Я не сторнник ооп. Да, оно бывает в определенных ситуациях нужно, но количество этих ситуаций и количество "написал на классах потому, что модно и современно" я не считал. Для меня очень неожиданно было, когда случайно наткнутся на статистику кода в линях: кода на чистом си оказалось в 2.5 раза больше, чем на плюсах. Заставило задуматься на самом деле.
Цитата
А луа сегодня есть, завтра нет...отсюда как бы еще и вытекает вопрос а зачем собственно и переучиваться на луа и вникать в него, если он не востребован практически нигде(по сравнению с питоном, js и другими) ?

У него есть своя ниша в которую он плотно засел - геймдев. Сейчас по сути он там стандарт. Тот же wow по части аддонов полностью на нем написан (это просто дикий объем кода - их сотни тысяч), GTA вся логика на lua описывается. Причем если вов был изначально такой, то переход на lua такой большой корпорации, как Rockstar не мог не быть тщательно взвешан. Так же в обработке траффика его частенько используют - nginx, wireshark. Это маркеры. Серьезные проекты и встаривание в них было вполне успешным. Да, язык не топ популярности, но ниша занята, его там никто не теснит, а нужное он делает на 5.
Зачем переучиваться? Ну я, например, знаю одну студию разработки в которой плюсовики нафигачили кода с классами и кучей переназначений в метатаблицах. Т.е. использовали возможности языка на все 100%. Вот только когда приходишь со своим самоваром в другой язык, то не очень хорошо получается в плане результа. Потом команда сильно разосралась, т.к. натуральным луашникам этот изврат не очень нравился, а плюсовикам было все пофигу и пальцы веером. В итоге выкинули всех за не совсем адекватность, уже год ищут луашников именно для переписывания всей этой крутоты на классах. Обрывки кода видел лично - искать где, что править в 10 раз переназначенных метаблицах полный бред. Это нужно делать либо тому человеку, который это писал, либо сидеть с маном в котором вся структура чуда. Луа не святой, есть свои огрехи, си я уважаю больше, асм еще больше, но у всего есть ниша и причины почему ни один язык не стал универсальным и доминирующим везде. Это я все к чему - со своим самоваром не стоит =)


--------------------
Скрипты под заказ.
Консультации по UOpilot через ICQ, Skype, Ventrilo, TeamSpeak, TeamViewer 700р/час.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 27.10.2018, 14:48
Сообщение #16


*******

Adept
Сообщений: 1.070
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 12209
Пользователь №: 16.156



Цитата(DarkMaster @ 27.10.2018, 14:00) *

Классы этого никак не меняют.

И справляется на самом деле очень неплохо. Тем не менее есть те же сокеты, биндинги под wxWidgets и Qt. Т.е. на нем пишут. Его распространненость скорее следствие работы не шибко большой группы и отсутствия макетинга. Это не Google который штампует языки и на них _будут_ писать вне зависимости от качества продукта.


Как бы меняют, ведь qt и виджеты являются ооп (или нет ?). Если бы не поддержка ооп из коробки, он бы загнулся в самом начале.

Цитата

Тут холивар может быть очень большим. Я не сторнник ооп. Да, оно бывает в определенных ситуациях нужно, но количество этих ситуаций и количество "написал на классах потому, что модно и современно" я не считал. Для меня очень неожиданно было, когда случайно наткнутся на статистику кода в линях: кода на чистом си оказалось в 2.5 раза больше, чем на плюсах. Заставило задуматься на самом деле.


это про линуксы ? Статистика чего ? Ядра ? Ну тогда не удивительно, что там си больше. printf быстрее потоков раза в 3 если не больше. А попробуй вывести через него сложную структуру, класс. Неудобно, не так ли ?

Цитата

У него есть своя ниша в которую он плотно засел - геймдев. Сейчас по сути он там стандарт. Тот же wow по части аддонов полностью на нем написан (это просто дикий объем кода - их сотни тысяч), GTA вся логика на lua описывается. Причем если вов был изначально такой, то переход на lua такой большой корпорации, как Rockstar не мог не быть тщательно взвешан. Так же в обработке траффика его частенько используют - nginx, wireshark. Это маркеры. Серьезные проекты и встаривание в них было вполне успешным. Да, язык не топ популярности, но ниша занята, его там никто не теснит, а нужное он делает на 5.


Да никто и не спорит с этим. Только вот учить его чтобы попасть на одну из 2 вакансий в Москве (hh.ru), когда есть unity c# 360+ вакансий.....Это если говорить о реальной его пользе, а не уровне пилота. Конечно, на нем пишут, только где....

Цитата

Зачем переучиваться? Ну я, например, знаю одну студию разработки в которой плюсовики нафигачили кода с классами и кучей переназначений в метатаблицах. Т.е. использовали возможности языка на все 100%. Вот только когда приходишь со своим самоваром в другой язык, то не очень хорошо получается в плане результа. Потом команда сильно разосралась, т.к. натуральным луашникам этот изврат не очень нравился, а плюсовикам было все пофигу и пальцы веером. В итоге выкинули всех за не совсем адекватность, уже год ищут луашников именно для переписывания всей этой крутоты на классах. Обрывки кода видел лично - искать где, что править в 10 раз переназначенных метаблицах полный бред. Это нужно делать либо тому человеку, который это писал, либо сидеть с маном в котором вся структура чуда. Луа не святой, есть свои огрехи, си я уважаю больше, асм еще больше, но у всего есть ниша и причины почему ни один язык не стал универсальным и доминирующим везде. Это я все к чему - со своим самоваром не стоит =)


Не стоит. А еще не стоит ставить человека на луа проект, который знает только c++.

Ради интереса зашел на одну из вакансий по луа:

Цитата
Для этого необходимо:

Опыт разработки на C#/C++
Опыт разработки на Android платформе: SDK, NDK
Английский язык - технический
Умение работать в команде
Желание работать в игровой индустрии
Желание и способность учиться
Необходимо знание языка LUA



И вот риторический вопрос, а зачем знание плюсов, да еще и тем более шарпов (где все классы) луашнику ? Сам по себе луа самодостаточен. Модули, метатаблицы - все что хочешь. Никак работодатель желает биндить классы (ведь для этого нужен опыт шарпа ?) через луа ?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 27.10.2018, 16:09
Сообщение #17


******

Expert
Сообщений: 669
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 598
Пользователь №: 19.007



Во какую тему замутил. А я вот со своим дилетантским взглядом считаю так, что если мне нужно вбить колышек, я беру кувалду, пару раз стукну и всё, а не вызываю машину для забивки свай. 99% пользователей Пилота "забивают колышки". Здесь не игрушки пишут и не рассчитывают турбулентность. Поэтому овчинка должна стоить выделки. Зачем мне тратить уйму времени и забивать голову ненужной информацией если нужно выполнить примитивнейшие действия. Лично для меня язык Пилота был абсолютно понятен сразу на 100%. И я быстро разберусь с любым скриптом, если будут адекватные имена переменных. С Lua намного сложней, там уже нужно частенько вникать подробно и с ходу в чужом коде можно мозги вывихнуть. Для меня Пилот, просто полезный и лёгкий в освоении инструмент. И меня практически всё в нём устраивает, но возникло пару моментов, где не хватает быстродействия, вот и решил перейти на Lua , но придётся потратить немало времени.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 27.10.2018, 17:08
Сообщение #18


***********

Модератор UOPilot
Сообщений: 8.364
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 25851
Пользователь №: 11.279



Цитата
Как бы меняют, ведь qt и виджеты являются ооп (или нет ?).

Насколько я понял там вообще пофигу ибо линкуется там все через очередь и пушится каждый параметр. Что есть дикий минус ибо дллки нужно обертывать весьма своеобразно и спокойно ту же сишную либу не подключишь. Так что едва ли =)
Цитата
И вот риторический вопрос, а зачем знание плюсов, да еще и тем более шарпов (где все классы) луашнику ? Сам по себе луа самодостаточен. Модули, метатаблицы - все что хочешь. Никак работодатель желает биндить классы (ведь для этого нужен опыт шарпа ?) через луа

Ну собственно ответ выше. Да и как бы начали с того, что это встраиваемый язык. Встраивать то его тоже надо =) А вот что там классы или не классы суть не важно.
Цитата
Лично для меня язык Пилота был абсолютно понятен сразу на 100%.

И да и нет. Честно? Разницы по сложности - ноль. Самого языка. Вот когда на грабли вставать будете - поймете, что луа намного проще) Разница в том, что луа в рамках пилота не настолько интегрирован. Те же записи/чтения файла. Не так много людей идут на луа (очень зря кстати), а те кто идут зачастую не считают проблемой самим написать такие вещи. Это недоработки интеграции. Пилот 20 лет почти вылизывался, луа - год. Ну и примеров совсем другое количество. Cirus вон какую сказку с допиливанием вики сделал. Для луа этого просто нет. Мне - это не нужно, я и так сориентируюсь по старым примерам, а человеку который только вникает и не имеет опыта программирования - это сложно. Грубо говоря не обжитой он просто.


--------------------
Скрипты под заказ.
Консультации по UOpilot через ICQ, Skype, Ventrilo, TeamSpeak, TeamViewer 700р/час.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
olduo.com
сообщение 27.10.2018, 18:17
Сообщение #19


*****

Journeyman
Сообщений: 336
Регистрация: 31.7.2016
Группа: Пользователи
Наличность: 0
Пользователь №: 18.060



Цитата(Cockney @ 27.10.2018, 14:48) *

Ради интереса зашел на одну из вакансий по луа:
Цитата
Для этого необходимо:

Опыт разработки на C#/C++
Опыт разработки на Android платформе: SDK, NDK
Английский язык - технический
Умение работать в команде
Желание работать в игровой индустрии
Желание и способность учиться
Необходимо знание языка LUA

И вот риторический вопрос, а зачем знание плюсов, да еще и тем более шарпов (где все классы) луашнику ? Сам по себе луа самодостаточен. Модули, метатаблицы - все что хочешь. Никак работодатель желает биндить классы (ведь для этого нужен опыт шарпа ?) через луа ?

хороший пример, именно потому что из игровой индустрии. большинство серверов с которыми работал в качестве скриптового движка используют луа, но не всегда все его возможности. обычно это просто серверный хук, который вызывает обработку в скрипте. потом ты уверен, что это вакансия луашника? ну т.е. если это серверный программист, то тебе нужно и "Опыт разработки на C#/C++" и "Необходимо знание языка LUA". если это луашник, то согласен, опыт в остальном второстепенен. я както тут писал про пацаньчика, которого взял на серверный луа.


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 27.10.2018, 18:24
Сообщение #20


******

Expert
Сообщений: 669
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 598
Пользователь №: 19.007



Я попробовал и даже простейшую функцию не смог сделать в Lua. Что-то не так с видимостью. А что не так пока не понимаю.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

- Текстовая версия | Версия для КПК Сейчас: 24.8.2019, 10:23
Designed by Nickostyle