Гайд | Lua для чайников {3 часть}

Гайды
  • Универсальный гайд по входу в кодинг на Lua

    Предисловие

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

    • деревья
    • списки (даже научимся создавать их с нуля)
    • библиотека table для работы с таблицами
    • сериализация
    • load()
    • переменная-placeholder
    • навыки гуглить

    библиотека table

    мы уже рассмотрели таблицы, а теперь перейдем к библиотеке для работы с ними. require прописывать не надо, так как библиотека стандартная

    table.insert() и table.remove
    local tbl = {["saber"]="сабер"} -- создаем таблицу
    
    table.insert(tbl, "карасик") 
    -- вставляем в таблицу строку "карасик" без ключа
    -- через table.insert() значение с ключом не вставить!
    
    print(tbl[1]) -- к значению "карасик" придется обратиться, 
    -- по его индексу, как у массива
    
    print(tbl["saber"]) -- а к значению "сабер" которому мы дали ключик, 
    -- обращаться только по ключу!
    
    print(tbl.saber) -- выпечатает сабера, 
    -- так тоже можно обращаться по ключу (через точку)
    
    print(tbl[0]) 
    -- напишет nil, так как к первому ( с нулевым индексом)
    -- которому мы задали ключ, обращаться можно только по ключу
    
    table.remove(tbl, 1)
     -- в table.remove() указать таблицу и индекс, 
    -- обьекта который мы хотим удалить
    print(tbl[1]) 
    -- выведет nil, карасика больше нет!
    
    table.remove(tbl, 0) -- попробуем удалить обьект с ключом..
    print(tbl["saber"]) 
    -- выведет сабера, 
    -- так как к обьекту с ключом по индексу не обратиться!
    
    table.remove(tbl, ["saber"])
    -- table.remove() выведет ошибку, 
    -- так как функция принимает только числа как второй аргумент!
    print(tbl["saber"]) -- мы никогда не узнаем..
    

    table.insert(таблица, индекс, обьект)
    таблица - table
    индекс - number
    обьект - any буквально любой тип, так как таблица может принимать все типы

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

    table.remove(таблица, индекс)
    таблица - table
    индекс - number

    значения, которые создавались в паре с ключом, по индексу тронуть нельзя

    односвязный список

    односвязный список - переменная которая помимо своего значения содержит следующий элемент списка
    грубо говоря, это матрешка, которая в себе содержит свой следующий элемент

    local lst = { -- создаем список, это называется КОРНЕМ списка, первый обьект
      value = nil, -- список содержит две переменные - его "значение"
      next = nil -- и следующий элемент списка
    }
    lst.value = 10 -- задаем "значение" первого элемента списка десяти
    
    local new_lst = { -- создаем второй элемент списка
      value = nil, -- изначально переменные списка nil
      next = nil
    }
    new_lst.value = 20 -- задаем значение второго элемента двадцати
    lst.next = new_lst -- а теперь задаем в первом элементе списка, как следующий элемент второй
    
    local newnew_lst = { -- создаем третий элемент списка
      value = nil,
      next = nil 
    }
    newnew_lst.value = 30 -- значение третего элемента списка - 30
    new_lst.next = newnew_lst -- следующий список у второго - третий
    
    print(lst.value) -- первый обьект, 10
    print(lst.next.value) -- второй обьект, 20
    print(lst.next.next.value) -- третий обьект, 30
    

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

    деревья

    сейчас изучим деревья. представь большое дерево, и от каждой его ветки идут еще две ветки
    Binary_tree_v2.svg

    теперь представим это в коде, у нас есть ветка, которая содержит свое значение, правую ветку, и левую ветку:
    root - корень по английски, это будет самый первый элемент дерева.

    local tree_root = {
        value = 10
        left = nil
        right = nil
    }
    

    value - значение
    left - левая ветка
    right - правая ветка

    local tree_root = { -- создаем первую ветку дерева
      value = 10, -- на первой ветке лежит десятка
      left = nil, -- левой ветки пока что нет
      right = nil -- правой ветки пока что нет
    }
    
    local first_right = { -- создаем первую ПРАВУЮ ветку дерева
      value = 20, -- на первой ПРАВОЙ ветке дерева лежит двадцатка
      left = nil, -- левой ветки ОТ ЭТОЙ ветки пока что нет
      right = nil -- правой ветки ОТ ЭТОЙ ветки пока что нет
    }
    tree_root.right = first_right -- задаем правую ветку самой первой ветки, только что созданной веткой
    
    local first_left = { -- создаем первую ЛЕВУЮ ветку
      value = 30, -- на первой ЛЕВОЙ ветке лежит тридцатка
      left = nil, -- от первой ЛЕВОЙ ветки нет еще одной левой ветки
      right = nil -- от первой ЛЕВОЙ ветки нет еще одной правой ветки
    }
    tree_root.left = first_left -- задаем самой первой ветке левую ветку нашей только что созданной левой веткой
    
    print("первая ветка: ", tree_root.value) 
    -- выведется 10, это значение самой первой ветки
    
    print("первая левая ветка: ", tree_root.left.value) 
    -- выведется 20, это значение первой-левой ветки
    
    print("первая правая ветка: ", tree_root.right.value)
    -- выведется 30, это значение первой-правой ветки
    

    это достаточно сложная тема и мне самому понадобилось время чтобы ее понять

    на 99% собеседований на работу программистом спрашивают про деревья!

    сериализация

    сериализация - процесс преобразования объекта в форму, пригодную для сохранения или передачи

    сериализация - это когда ты сохраняешь свою таблицу в текстовый файл, чтобы отправить ее другу!

    рассмотрим пример сериализации с помощью библиотеки IO (input/output):

    local workers = {"Дмитрий Антонов", "Дезроу Дезроев", "Тимофей Коробка"}
    -- создаем массив строк "работников"
    
    save_file = io.open("workers.txt", "w")
    -- через библиотеку io открываем файл workers.txt
    
    io.output(save_file)
    -- говорим программе "дальше выводи все в save_file"
    
    for i = 1, #workers do -- запускаем цикл по всем элементам массива
      io.write(workers[i], "\n")
      -- через io печатаем каждого работника, после ставим \n (знак новой строки)
    end
    
    io.close(save_file) 
    -- обязательно закрываем файл, иначе компьютер будет ждать новых инструкций с файлом
    

    рассмотрим каждую функцию по порядку:

    io.open(название_файла, режим_файла)
    название_файла - string, просто название файла
    режим файла - string, режим открытия файла:

    r - read, только читать; w - write, переписывает весь файл; a - append (добавить), открывает или создает файл для добавления чего-то к нему; r+ - read и write; w+ - read и write, полностью переписывает файл или создает его; a+ - append и read, открывает уже созданный файл или создает новый.

    io.output(файл)
    файл - файл, который был создан с помощью io.open()
    примечание - по умолчанию io.output() - консоль

    for i = 1, #массив do …
    массив - название массива, “#” перед ним позволяет итерироваться столько раз, сколько элементов в массиве

    io.write(содержимое)
    содержимое - строка
    печатает содержимое в io.output(), по умолчанию это консоль

    io.close(файл)
    файл - файл, который был создан через io.open()
    перестает ожидать инструкций о работе с ранее открытым в io.open(). обязателен если был io.open()!!

    пауза

    вот и закончилась базовая часть Lua, теперь мы будем переходить к более сложным вопросам, но сначала я хотел бы рассказать необходимые инструменты настоящего погромиста

    google

    да, навыки гуглить тебе очень пригодятся и я хотел бы дать небольшую базу как их использовать:
    представим что я хочу найти рецепт торта медовика:
    VLsu1wR.png
    А ГДЕ МЕДОВИК?! ПОЧЕМУ ТУТ ВООБЩЕ НЕТ МЕДОВИКА!
    **можно сделать мой запрос таким: **
    рецепт торт "медовик" - я указал медовик в кавычках, это означает что это слово ОБЯЗАТЕЛЬНО должно быть в предложенном результате
    VR3Dd3o.png
    результаты лучше!!

    писать на английском (если ты его знаешь)

    представим что я хочу найти как подключится к базе данных через glua:
    zcJCoku.png
    на русском - результатов нет!
    попробуем на английском:
    xAEi4Lh.png
    на английском - результаты есть!!

    переменная placeholder

    делаешь цикл через pairs, но тебе не нужно одно из значений? так просто поставь плейсхолдер! забей хуй

    local tbl = {"chelog", "dima"} -- делаем массив
    for _,v in pairs(tbl) do -- ставим вместо k плейсхолдер (_)
      print(v)
    end
    

    да-да плейсхолдер - нижнее подчеркивание
    он указывает на то, что тебе не нужно получать эту переменную
    а почему просто ничего не ставить на месте k?
    так как k - первый аргумент, v будет иметь значение, подготовленное для k просто с другим названием!

    функция load()

    универсальная и ОЧЕНЬ мощная функция, превращает ЛЮБУЮ строку которую вы ей дадите в функцию:

    local code = "local s = 'привет, мир!'; return s"
    f = load(code)
    print(f())
    

    для обозначения новой инструкции компьютеру в одну строку ставят “;”

    _G (_global)

    глобальная таблица которая позволяет нам вписывать туда новые значения с ключами:

    _G["chelog"] = "dima"
    print(_G["chelog"])
    

    также можно создать глобальную функцию:

    function _G.print_chelog()
      print("chelog")
    end
    _G.print_chelog()
    

    мы присвоили к переменной (таблице) _G функцию print_chelog() и теперь можем обращаться к ней через точку!

    заключение 1 главы

    теперь ты готов переходить к изучению glua
    у тебя есть два варианта:

    читать документацию glua - ты теперь с улицой
    ждать новой части гайда, уже по glua

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

    обратная связь (вопросы насчет кода)

    смело пиши мне в личные сообщения дискорда - timofeyw
    я постараюсь ответить в кратчайшие сроки

    обратная связь (вопросы насчет топика, ошибки топика)

    можешь писать прямо в комментарии этого топика или мне в личные сообщения дискорда - timofeyw

    спасибо и удачи! новая глава выйдет как можно скорее

  • тимиепТ тимиеп сослался на эту тему в

Похожие темы