Ответы пользователя по тегу Lua
  • Как на языке Lua сделать POST запрос к сайту?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    В самом языке Lua нет возможности взаимодействовать с Интернетом.

    Чтобы эту возможность добавить, нужно задействовать какое-нибудь расширение. Например, LuaSocket. Или можно написать своё. В любом случае, это будет на стороне ядра приложения, куда встраивается Lua. А в самом языке будет лишь доступ к предоставляемому приложением API.
    Ответ написан
    3 комментария
  • Стоит Ли Учить Lua В 2020?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Lua актуален в 2020 и будет актуален ещё долго.
    Учить стоит.

    Только там нечего учить. :) Язык настолько простой, что программисту хватит максимум 30 минут для освоения. Для более простых людей, но владеющих хотя бы логикой и простой математикой, ну день должно хватить, думаю. А для всех остальных есть книжка Роберта Иерузалимски (автора языка), в которой всё разжевано до мелочей.

    В общем, начните с такого запроса в гугле: lua in 15 minutes
    А дальше - как пойдет.
    Ответ написан
    Комментировать
  • Как отредактировать строку по её индексу при чтении построчно файла?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    1) Считать все строки файла в массив (таблицу).
    2) Изменить элемент (строку) №22 в массиве.
    3) Перезаписать файл, записав в него из массива все строки заново.
    Ответ написан
    Комментировать
  • Как запустить функцию?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    _G['SomeText'..i]:GetName('12','34')
    Ответ написан
  • Как рашифровать код Lua?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Файл зашифрован.
    Это не Lua, и даже не байт-код Lua.
    Без алгоритма шифрования и ключа прочитать невозможно.
    Ответ написан
  • Как исправить ошибку в Corona SDK?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    local boostButton = display.newCircle(display.contentCenterX, 400, 30 )
    local test = boostButton:setFillColor(40/225, 60/225, 30/225)

    В этом случае теперь boostButton содержит результат работы newCircle, т.е. ссылку на кнопку.
    А вот переменная test содержит результат работы setFillColor, т.е. nil
    Ответ написан
    Комментировать
  • Ответ от сервера к скрипту не отправляется, как исправить?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Не могли бы вы подсказать, что я делаю не так?

    Не так вы делаете отладку вашего скрипта. Если бы вы делали так, как надо, то быстро бы нашли ошибку.

    Научитесь отлаживать свои программы, иначе вы не имеете права называться программистом. А когда столкнетесь с реальным парадоксом, то сведите его к 2-3 строчкам кода, который любой желающий сможет легко воспроизвести у себя, - и можно будет задать вопрос на Тостере.

    Кроме того, вы не так даже задали этот вопрос. Потому что не описали результат. Ведь слова "не работает" или "не отправляется" ни о чем не говорят человеку, который готов вам ответить. Текст ошибки где?? Вам нужно хотя бы немножко думать о тех, кому вы пишете, ставить себя на их место. А на текущий вопрос даже начать отвечать не получится, а про ответ-решение вообще молчу.
    Ответ написан
    Комментировать
  • Не находится функция библиотеки?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Ну, lua_getglobal определена через lua_getfield, так что выходит, что макрос работает, а сам символ нет.
    spoiler
    #define lua_getglobal(L,s)  lua_getfield(L, LUA_GLOBALSINDEX, s)

    Попробуйте поиграть с флагами компиляции типа -Wl,-export-dynamic
    Ответ написан
  • Ошибка скрипта: bad argument #2 to 'format' (number expected, got string) stack traceback: [C]: in function 'format'?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    sampSendChat(string.format('/get guns %d', tonumber(msg)))


    А еще можно проще:
    sampSendChat('/get guns ' .. msg))
    Ответ написан
    Комментировать
  • Corona SDK для десктопа - легально?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    А не будет полностью 100% кроссплатформенных движков, потому что сами платформы отличаются. На десктопе есть мышь, так что в игре можно сделать "наведение мыши на объект (или кнопку)" с последующей всплывающей подсказкой, либо можно сделать "нажатие правой кнопкой мыши" для вызова контекстного меню. Про клавиатуру вообще молчу. Если вы хотите это всё, то либо путь в мобайл будет закрыт, либо придется делать как бы две версии игры. И это не автоматически движком подхватывается, а вы сами должны решить, как у вас в игре будет. Часть кнопок клавиатуры можно вынести на экран, но не всю клаву, а как можно меньше кнопок. Правую кнопку можно эмулировать долгим нажатием и т.д. Соответственно, если плясать от мобильного приложения, то в игре управление будет сильно ограничено, примитивно, да и сам геймплей может пострадать в итоге.

    Что касается Lua, то это вообще практически самый простой язык в мире. Учится минут за 15-30. Весь. Гораздо больше времени потребуется на освоение самого движка, его документации, возможностей, API и пр.

    P.S. Насчёт слова "легально" так и не понял, какое оно имеет отношение к вопросу.
    Ответ написан
    Комментировать
  • Как элегантнее всего сделать функцию, которая округляет число, только если он ближе 0.1 к целому, иначе nil?

    dollar
    @dollar Автор вопроса, куратор тега Lua
    Делай добро и бросай его в воду.
    local function round_or_nil(num)
    	local res = math.floor(num + 0.5)
    	local diff = math.abs(res - num)
    	return (diff <= 0.1 or diff >= 0.9) and res or nil
    end
    Ответ написан
    Комментировать
  • Как перебрать массив строк?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    1) А что вам важнее, изящество или скорость?
    1.а) Во-первых, изящнее использовать встроенную функцию ipairs, которая как раз интерирует индексный массив:
    lines = {"sdss", "vfbf"}
    for i, line in ipairs(lines) do
      print(line)
    end

    Это изящнее, чем просто обращение по индексу, потому что исчезает строка создания переменной line, она задаётся в самом цикле. Однако с точки зрения производительности такой способ медленнее, потому что конструкции языка быстрее, чем обращение к функциям, даже встроенным. Так что если у вас миллиарды строк, то лучше ваш вариант, хоть он и менее изящен.

    1.б) Во-вторых, в вашем примере создаётся переменная line глобально. Это не ошибка, но может привести к ошибке в будущем, если код будет сложный. Поэтому делать так совсем не изящно. Лучше писать так:
    local line = lines[i]
    Это создаст локальную переменную внутри цикла. Она не будет доступна вне цикла. А если есть одноименная глобальная переменная, то с ней ничего не произойдет. Везде, где только можно, лучше использовать слово local, оно ограничивает область видимости переменной текущим блоком (и вложенными блоками).

    Кстати, массив lines тоже желательно задавать через local, если ваш скрипт не рассчитан на несколько файлов и общее глобальное пространство имен между ними. Дело в том, что такие локально-глобальные переменные в пределах файла чуть быстрее, чем классические глобальные.

    2) nil выводит потому, что строки в lua не являются итерируемыми объектами, в отличие от строк в javascript, например. То есть строка является объектом, поэтому обращение к свойству [j] не является синтаксической ошибкой, но свойства такого у строки нет, поэтому line[j] возвращает nil.

    Обращение к символу в Lua происходит через функцию подстроки:
    line:sub[j,j]
    То есть мы буквально вырезаем подстроку с позиции j до позиции j, это и есть один символ.

    Опять же, красиво создавать локальные переменные, чтобы читателю вашего кода было понятно, что происходит, а потом их использовать. Желательно с комментариями. Например, так:
    local c = line:sub[j,j] --Получаем символ с номером j
    print(c) --Выводим символ


    3) Ну и, наконец, если вам не важна скорость и производительность совсем, а под изяществом вы понимаете как можно более короткую (и/или сложную для понимания) запись кода, то вам подойдёт что-то вроде этого:
    Пример
    lines = {
      "sdss",
      "vfbf",
    }
    
    for i,line in ipairs(lines) do
      for c in line:gmatch"." do
        print(c)
      end
    end
    Пример 2
    lines = {
      "sdss",
      "vfbf",
    }
    
    for i,line in ipairs(lines) do
      line:gsub(".",function(c)
        print(c)
      end)
    end

    Ведь в Lua использовать в качестве итератора любую функцию, кроме pairs и ipairs, очень необычно, не всем понятно, зато "изящно" (если это можно так назвать). Передавать функции в качестве аргументов другой функции - приём также чуть сложнее, чем просто цикл. Ну и регулярные выражения, само собой разумеется, отдельная сложная тема. Тем более, что в Lua регулярки немного иначе устроены, то есть ещё +10% к сложности.
    Ответ написан
    1 комментарий
  • Почему MySQL возвращает пустое значение?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    print("Login: " .. tostring(inputs[1]))
    В общем, в ключевых местах расставьте print, - сразу увидите, что происходит.
    Также попробуйте на всякий случай: print(#tostring(inputs[1])), а то вдруг пробел в конце прицепился или ещё что.
    Ответ написан
  • Как использовать if с несколькими значениями?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    local x, y, z = streetIsMyHome()
    if x == 1 and y == 2 and z == 3 then
      print("Working")
    end


    Если не хотите "мусорить" переменными в пространстве текущего файла или текущей области видимости, то:
    Код
    function streetIsMyHome()
      return 1, 2, 3
    end
    
    do
      local x, y, z = streetIsMyHome()
      if x == 1 and y == 2 and z == 3 then
        print("Working")
      end
    end

    Еще один вариант - написать свою собственную функцию сравнения:
    Код
    function isEqualAll(...) --сравнивает первую половину аргументов со второй
      local t = {...}
      local half = math.floor(#t/2 + 0.5);
      for i=1,half do
        if t[i] ~= t[i+half] then
          return false
        end
      end
      return true
    end
    
    function streetIsMyHome()
      return 1, 2, 3
    end
    
    if isEqualAll(1,2,3,streetIsMyHome()) then
      print("Working")
    end

    Но самое правильное и красивое - делать отдельную функцию для каждой конкретной задачи:
    Код
    function streetIsMyHome()
      return 1, 2, 3
    end
    
    function checkStreetIsMyHome(a,b,c)
      local x,y,z = streetIsMyHome()
      return a==x and b==y and c==z
    end
    
    if checkStreetIsMyHome(1,2,3) then
      print("Working")
    end
    Ответ написан
    Комментировать
  • Как решить проблему с GitHub чего делать?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Залейте через веб-интерфейс.
    Или заранее переведите в UTF-8.
    Ответ написан
  • Как удалить элемент из Json таблицы Lua?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Как удалить элемент из Json таблицы Lua

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

    Например, Lua таблицу (сложную структуру в памяти) можно перевести в формат JSON (текстовая строка), затем эту строку передать по сети или сохранить в файл, затем другое приложение в другое время на другом языке и даже платформе сможет прочитать эти данные и перевести в свой внутренний формат (переменные, структуры и т.д.) для дальнейшей работы.

    Чувствуете разницу? А у вас понятия смешались. Уточните, что вы хотите.
    Ответ написан
    Комментировать
  • Love2d - можно ли запаковать и защитить игру?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Сейчас модно не запаковывать и защищать игру, а наоборот - открывать исходники. Тогда фанаты помогают с поиском ошибок, а также пишут моды для игры. Собственно, если логика игры на Lua, то сам бог велел добавить поддержку модов, а моддерам очень помогают открытые исходники. То есть открытость делает игру успешнее и популярнее (хотя для этого начальное минимальное значение популярности у неё всё же должно быть).

    Ну а защищает игру авторское право.
    Ответ написан
    Комментировать
  • Подходит ли lua для разработки полноценной игры?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Lua - удобный и красивый язык. Но далеко не самый быстрый. Главный его плюс в том, что на нём очень удобно описывать игровую логику - в этом плане он сильно похож на JavaScript. Ещё его плюс в том, что к играм будет легко писать модификации (конечно, не к мобильным играм).

    Главный недостаток в том, что Lua однопоточный, и в нём не содержится никакой возможности распараллелить работу (в этом он опять же похож на JavaScript, хотя синтаксис совсем разный).

    1) Подходит.
    2) LÖVE простой движок, без абстракций, много свободы, но есть недостатки. Например, готовая игра занимает 100% CPU. Побороть можно костылями.
    Ответ написан
    Комментировать
  • Как мне найти координаты числа?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Очевидно, число 4 находится в первом столбце (x==1) и второй строке (y==2).
    Это видно невооруженным глазом.
    Программно это можно выяснить так:
    array = {
        1,2,3,
        4,5,6,
        7,8,9
    }
    
    function getXY(num)
        local x,y,i=1,1,1
        while array[i] ~= num do
            i = i + 1
            x = x + 1
            if x > 3 then
                x = 1
                y = y + 1
            end
            if not array[i] then return end
        end
        return x,y
    end
    
    print(getXY(4)) --1,2
    print(getXY(8)) --2,3
    print(getXY(3)) --3,1

    А если вам нужна обратная задача (по координатам искать число), то вот:
    array = {
        1,2,3,
        4,5,6,
        7,8,9
    }
    
    function find(x,y)
        return array[(y-1)*3 + x]
    end
    
    print(find(1,2)) --4
    print(find(2,3)) --8
    print(find(3,1)) --3

    Но всё же лучше пересмотреть способ хранения данных. Например, так:
    array = {
        { 1,2,3 },
        { 4,5,6 },
        { 7,8,9 },
    }
    Ответ написан
    4 комментария
  • Как в lua указать кол-во символов в регулярном выражении?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Для начала, лучше не использовать слово string для имени переменной, т.к. это целая библиотека для работы со строками. Вы перекрываете к ней доступ.

    В Lua нет полноценных регулярных выражений, потому что Lua задумывался как максимально лёгкий язык. Вместо этого используется т.н. "соответствие шаблону". Так что {2} не работает. Просто в большинстве случаев хватает модификаторов + - * ?

    В вашем случае подойдёт:
    local str = "qw.erty"
    return str:match("([a-z][a-z])%.")

    Или даже:
    local str = "qw.erty"
    return str:match("(%l%l)%.")
    Ответ написан
    Комментировать