Lua как переименовать файл

Обновлено: 07.07.2024

Таблицы в целом — самый важный тип данны в Lua.

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

Самый простой массив выглядит так:

«Заполнять» массивы можно так:

После последнего элемента запятая не обязательна.

Индексация массивов — это следующий параграф.

§14.1.1. Индексация массивов.

Индексация массивов в Lua начинается не с нуля, как в некоторых других языках (в том же C), а с единицы.

Полностью эквивалентна этой:

Подобная индексация нежелательна:

Почему? Это следующий параграф.

Но если надо, можно так:

§14.1.2. Определение длины массива.

Вот простой пример:

Чтобы не было проблем с версиями Lua, дальше уже будет писаться только table.getn().

Здесь напечатается 3, поскольку в массиве три элемента.

А что напечатается здесь?:

А напечатается здесь 1, поскольку индекс два равен nil.

А тут вовсе напечатается 0:

Поскольку индекс один равен nil.

Потому что тут вообще ошибка вылезет.

В общем, чтобы оператор длины работал корректно, нужно указывать все индексы правильно, или не указывать вообще, — Lua это сам сделает.

§14.1.3. Обращение к элементам массива.

Обращение к элементам массива происходит так:

Пишется название массива, затем в квадратных скобках указывается его индекс.

§14.1.4. Цикл обхода всех элементов массива.

Вот, собственно, один из двух циклов, упомянутый в §10.5.

Для обхода всех элементов массива используется расширенный арифметический цикл for вместе с переменной ipairs.

То, что перед запятой, — индекс массива, а после — его значение (для примера ниже значение первого индекса — "one").

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

Иногда в получении индекса либо значения нет необходимости, в таком случае, переменная заменяется на подчёркивание:

§14.1.4.1. Обход элементов массива иными способами.

Для обхода все элементов можно и не пользоваться ipairs и for .. in, а просто воспользоваться арифметическим for и оператором длины:

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

Только стоит учесть, что при использовании этого варианта получение значения массива будет недоступным.

А вот может случиться такая ситуация, что нескольким (но не всем) элементам массива необходимо будет присвоить одно и то же значение. Можно, конечно, воспользоваться примитивными методами, типа:

И так далее. Но намного быстрее воспользоваться арифметическим for:

Для всех элементов можно по стандарту:

for i,_ in ipairs(m) do
m[i] = nil;
end

Тут уже кому как.

§14.1.5. Массивы внутри массивов.

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

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

Обход такого массива выглядит так:

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

Таблицы — это набор пар «ключ — значение». Конструкция такая же, как и у массивов.

В отличии от массивов элементы таблицы таблицы индексируются переменными. А значением может быть абсолютно любой тип данных Lua, да и вообще всё что угодно:

Как уже было сказано выше, значением таблиц могут быть и числа, и булевые значения (true, false), и функции, и строки, и таблицы, и массивы, и даже nil.
Для отделения типов данных друг от друга будет удобно использовать точку с запятой вместо обычной запятой:

t = <
number1 = 1,
number2 = 2;
str = "string";
t2 = <
n = 4;
n1 = true;
>;
m = ;
jj = false,
gg = true;
wtf = nil;
>;

§14.2.1. Обращение к элементам таблицы.

Почти всегда обращение выглядит так:

Когда в таблице таблица, обращение происходит так:

Когда в таблице массив, обращаться можно так:

Ну и понятно, что если в таблице есть массив, внутри которого массив, обращаться можно так:

Для таблиц понятия «длина» как такового нет, так что использовать соответствующего оператора для таблиц нельзя.

§14.2.2. Цикл обхода элементов таблицы.

Что это — обьяснять не надо. Для обхода элементов таблицы используется pairs, вместо ipairs. И обычно вместо переменной i (index) используется k (key) (но можно, естественно, писать свои названия).

Есть таблица со списком оружия и его уроном в процентах. Надо присвоить всему оружия нулевой урон:

Weapons = <
Knife = 20,
Pistol = 40,
ShotGun = 80,
AssaultRifle = 85,
SniperRifle = 95,
MiniGun = 100,
RocketLauncher = 110,
>;

§14.2.3. Функции в таблицах.

Сразу создать функцию в таблице, похоже нельзя. Но если такое необходимо, это можно сделать следующим образом:

§14.3. Функции для работы с таблицами.

Все они начинаются с «table.» (от англ. «table» — ‘таблица’). Вот все они:

table.concat(table [, sep [, i [, j]]]):

Задан массив, в котором все элементы — строки или числа, возвращает table[i]..sep..table[i+1] ··· sep..table[j]. Значение по умолчанию для sep — пустая строка, значение по умолчанию для i — 1, а для j — длина таблицы.
Если i больше j, функция возвращает пустую строку.

table.insert(table, [pos,] value):

Вставляет элемент value в позицию pos в table, сдвигая вверх остальные элементы. Значение по умолчанию для pos равно n+1, где n — длина таблицы, т. о., вызов table.insert(t,x) добавляет x в конец таблицы t.
Только для массивов.

Удаляет из table элемент в позиции pos, сдвигая вниз остальные элементы, если это необходимо. Возвращает значение удаленного элемента. Значение по умолчанию для pos — n, где n — длина таблицы, т. о.,
вызов table.remove(t) удаляет последний элементы таблицы t. (Примечание: использование insert-remove со значениями по умолчанию позволяет работать с таблицей как со стандартным LIFO – стеком) Только для массивов.

Сортирует элементы таблицы в заданном порядке внутри таблицы, начиная с table[1] и заканчивая table[n], где n — длина таблицы. Если параметр comp задан, то он должен быть функцией,
которая для двух получаемых параметров возвращает true, если первый из них меньше второго (т. о., not comp(a[i+1],a[i]) будет верно для любого i давать true после окончания сортировки).
Если comp не задан, то вместо него будет использован стандартынй оператор Lua «<».

Алгоритм сортировки не стабилен; в том смысле, что равные элементы могут быть переставлены в процессе сортировки.

Также ещё существуют такие полезные функции для массивов:

Возвращает следующей индекс массива после указанного и соответствующее ему значение.

Возвращает либо все значения массива, либо от одного индекса и до другого.

Возвращает значение указанного индекса массива.

Вместо этого можно просто написать так:

Присваивает указанному индексу массива новое указанное значение.

Вместо этого можно просто написать так:

Все эти функции начинаются с «io.» (сокр. от англ. «input-output» — ‘ввод-вывод’). Главное применение — изменение внутреннего содержания файла непросредственно из Lua-скрипта.
Вот четыре функции, которые понадобятся для этого:

Открывает файл по указанному пути в указанном режиме. Режимов всего три:
«r» — режим чтения. Данный режим используется как режим по умолчанию. То есть, если не указать режим, файл откроется в данном режиме;
«w» — режим записи. Вся имеющаяся ранее информация стирается;
«a» — режим дозаписи в конец файла. Вся имеющаяся ранее информация сохраняется.
Путь в свою очередь пишется в кавычках; название файла обязательно должно иметь расширение. Если в указанной директории не существует такого файла, он будет создан.

Записывает в указанный файл указанные значения. Ими должны быть только строки, числа и управляющие последовательности. file — переменная, открывающая файл (ниже всё станет понятно).

Сохраняет сделанные изменения в указанном файле.

Закрывает указанный файл.

Нужно дописать в конец файла script.lua, расположенного в папке data, несколько строк:

-- создаём массив из строк, которые необходимо добавить в конец нашего файла
local ns = <
"string1",
"string2",
"string3",
"string4",
"string5",
>;

После открытия файла в конце будет следующее:

string1
string2
string3
string4
string5

§15.1. Ещё несколько полезных функций.

Открывает указанный файл в режиме чтения, считывает из него все имеющиеся в нём в строке и возвращает каждую отдельно.

После конца цикла эта функция автоматический закрывает файл.

То же, что и io.lines, но не закрывает файл file после окончания цикла.

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

"set" — начало файла;
"cur" — текущая позиция;
"end" — конец файла.

Вторым аргументом (число) можно приплюсовать к первому дополнительное количество строк, которое нужно отсчитать от выбранной позиции.

Все эти функции начинаются с «os.» (сокр. от англ. «operation system» — ‘операционная система’) Вот некоторые из них:

Возвращает примерное количество времени (в секундах), которое программа выполнялась на CPU.

Возвращает дату, отформатированную в соответствии с заданным форматом.
Если аргумент time передается функции, то должно быть отформатировано «время» (os.time). В противном случае, параметр date используется для форматирования текущего времени.
Если параметр format начинается с «!», то время форматируется в соответствии с универсальным глобальным временем (по Гринвичу). После этого опционального символа, если format равен «*t», то date возвращает таблицу
со следующими полями: year (год, четыре цифры), month (месяц, 1—12), day (день, 1—31), hour (час, 0—23), min (минуты, 0—59), sec (секунды, 0—61), wday (день недели, воскресенью соответствует 1 и так адлее), yday (день года),
и isdst (флаг дневного времени суток, тип boolean).
Если format не равен «*t», то функция date возвращает дату в виде строки, отформатированной в соответствии с правилами функции C strftime.
При вызове без аргументов возвращают дату, во время которой была вызвана данная функция, в соответствии с установленными датой и временем оперционной системы, в следующем формате: MM/DD/YYYY HH:MM:SS.

Возвращает время, прошедшее от первого аргумента до второго, в секундах. На самом деле функция просто возвращает значение первого аргумента минус значение второго аргумента.

Читайте также: