Lua как переименовать файл
Таблицы в целом — самый важный тип данны в 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.
Для отделения типов данных друг от друга будет удобно использовать точку с запятой вместо обычной запятой:
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.
Возвращает время, прошедшее от первого аргумента до второго, в секундах. На самом деле функция просто возвращает значение первого аргумента минус значение второго аргумента.
Читайте также: