Открываем файл lua на компьютере!
Каждому пользователю полезно узнать, как открыть файл lua, особенно если возникла необходимость просмотреть документ такого типа.
Расширение LUA
Расширение файла LUA связано с языком сценариев Lua, который используется для увеличения возможностей многих различных приложений и компьютерных игр. Язык сценариев Lua также используется в различных промышленных программах, таких как Photoshop Lightroom от Adobe Systems.
Этот язык популярен благодаря своей гибкости и универсальности. Он может работать с различными платформами, использующими стандартный компилятор для языка С.
Документы с таким расширением представляют собой исходный код и скрипт, который определяет действия, выполняемые ПК при запуске программ и приложений. Скрипт поддерживает автоматизированные процессы для операционных систем и приложений, которые на них работают.
Файлы исходного кода компактны, чтобы избежать ненужного увеличения размера приложения. Документы LUA скомпилированы в виде архива, созданного утилитой TAR. TAR – это UNIX-утилита, которая используется для упаковки нескольких элементов в одну папку.
Хотя TAR на самом деле является инструментом архивации, он также известен как архиватор с нулевым сжатием. Несколько документов могут быть заархивированы с использованием формата TAR, но они не сжимаются, как в ZIP.
Как открыть элементы в формате LUA
Поскольку файлы LUA можно открывать несколькими программами и приложениями, нужно дважды щелкнуть на элемент, чтобы увидеть, будет ли он автоматически открываться в программе по умолчанию, установленной на компьютере.
Эти файлы обычно состоят из простых текстовых типов документов, поэтому на ПК уже может быть соответствующая программа.
На ПК под управлением Windows можно открывать такие документы с помощью любого текстового редактора, такого как Блокнот или WordPad. Следует просто щелкнуть правой кнопкой мыши на иконку и выбрать «Открыть с помощью» в раскрывающемся меню.
В подменю целесообразно нажать на текстовый редактор, который можно использовать, или нажать «Обзор», если программа отсутствует в списке.
Достаточно выбрать приложение из списка установленных программ, поставить галочку в поле «Всегда использовать эту программу, чтобы открыть файл этого типа», а затем нажать «ОК». Всякий раз, когда есть необходимость открыть элемент с расширением LUA, он автоматически будет использовать выбранный текстовый редактор в качестве приложения по умолчанию.
Если элемент LUA содержит исходный код и сценарии для игровых приложений, используемых с Windows, его можно открыть с помощью набора дополнений World of Warcraft от Blizzard Entertainment или World of Warcraft AddOn Studio.
В Mac OS X есть возможность открывать документы, используя любую программу для редактирования текста, совместимую с Mac, например TextMate или Apple TextEdit. Также можно использовать компилятор C или C ++, который предоставляется проектом GNU и доступен для бесплатной загрузки на веб-сайте GNU.org.
Если файл содержит исходный код и сценарии для игр, совместимых с Mac OS X, допускается использование Rovio Mobile Angry Birds, который доступен на веб-сайте Rovio или в комплекте дополнений World of Warcraft Interface от Blizzard Entertainment.
Для операционной системы Linux можно использовать Emacs или C и C ++ Compiler. Обе программы имеют открытый исходный код и доступны для бесплатной загрузки на веб-сайте GNU.org. Кроме того имеется возможность использовать любую программу для редактирования текста для Linux, такую как gEdit, Vim или Nano Editor.
Открыть документ с подсветкой кода
Конечно, можно использовать любой текстовый редактор для просмотра элементов с таким типом. Но лучше использовать редактор с подсветкой кода. Один из них – это инструмент Sublime Text. Но можно использовать и Notepad ++.
На изображении ниже есть возможность увидеть разницу между программой с подсветкой кода и классическим блокнотом.
Таким образом, можно заметить, что некоторые ключевые слова показаны в определенных цветах. Так код стает более читабельным и можно наглядно просмотреть его структуру.
Кроме того, в программе видно количество строк. Это особенно полезно, когда в журнале ошибок появляется оповещение: «строка 23 в example.lua». Отыскать проблему можно намного быстрее.
Еще одна полезная функция: если дважды щелкнуть слово, оно выделяется во всем документе.
Опция используется для проверки написания и при просмотре игрового кода, когда есть смысл отыскать, где используется функция (например, SILVER_BIRDCAGE).
Во время поиска нужно учитывать, что код чувствителен к регистру, то есть: Silver_birdcage, silver_birdcage и SILVER_BIRDCAGE – это не одно и то же.
Другой вариант поиска, но в большем масштабе, это «Найти в файлах» (комбинация клавиш Ctrl + Shift + F). Этот вариант позволяет искать что-то во всех документах указанной папки. Почему это полезно?
Допустим, необходимо добавить функцию «onattackother» к своему персонажу или монстру и надлежит получить лучший пример того, как и что можно сделать.
Для этого подобает ввести «onattackother» и выбрать путь к папке: «C:\Steam\steamapps\common\Don’t Starve Together\data\scripts\prefabs». Результат поиска изображен ниже.
Далее просто нужно дважды щелкнуть на строку, чтобы открыть соответствующий файл и просмотреть функцию.
Следовательно, для программистов намного лучше использовать программу с подсветкой синтаксиса.
Проблемы с открытием файла
Если не получается открыть документ LUA, нелишне просмотреть перечисленные возможные причины и выяснить точную причину этой ошибки:
Если принято решение устранить проблему самостоятельно, лучше иметь базовые знания о том, как работает компьютер. Стоит быть очень осторожным и терпеливым, особенно при внесении изменений в системный реестр. В противном случае можно столкнуться с другой проблемой при попытке исправить эту.
Слишком много пользователей испытывают трудности с открытием файлов с расширением LUA. Поэтому важно внимательно искать причину возникшей ошибки.
Заключение
Элементы с расширением LUA очень популярны и существует много способов их открыть: используя любой текстовый редактор (WordPad, Блокнот, TextEdit) или с помощью редакторов подсветкой синтаксиса (Sublime Text, Notepad ++).
LUA – Файл с кодом на языке Lua (Lua Source File)
Расширение LUA
Чем открыть файл LUA
В Windows: Dawn of War Mod Tools, Addon Studio for World of Warcraft, Blizzard World of Warcraft Interface AddOn Kit, Блокнот, Notepad++, Sublime Text, Adobe ExtendScript, Lua Player for PSP, Любой другой текстовый редактор
В Mac OS: GNU project C and C++ compiler (GCC), Blizzard World of Warcraft Interface AddOn Kit, Rovio Mobile Angry Birds, MacroMates TextMate, Любой другой текстовый редактор
В Linux: gedit, GNU project C and C++ compiler (GCC), GNU Emacs, Vim, Любой другой текстовый редактор
Описание расширения LUA
Популярность:
Расширение LUA обычно ассоциируется с так называемыми скриптами, написанными на языке Lua. Lua является мощным, быстрым, легким, встраиваемым скриптовым языком. По идеологии и реализации похож на JavaScript. Lua объединяет простой процедурный синтаксис с мощным описанием данных конструкций на основе ассоциативных массивов и расширяемой семантики. Lua представляет собой язык с динамическим определением типов данных, работает, интерпретируя байт-код для основе регистров виртуальной машины, и имеет автоматическое управление памятью с дополнительным сбором мусора, что делает его идеальным для конфигурации, разработки сценариев и быстрого прототипирования.
В Lua восемь основных типов:
- nil (неопределенный) обозначает отсутствие пригодного значения
- boolean (логический) состоит из false (ложь) и true (истина)
- number (числовой) – это вещественные числа (double)
- string (строковый)
- function (функция)
- userdata (пользовательские данные)
- thread (поток)
- table (таблица)
Язык Lua вляется свободно распространяемым, с открытыми исходными текстами на языке Си. Может компилироваться в программу при помощи компилятора ANSI C. Lua разработан подразделением Tecgraf Католического университета Рио-де-Жанейро в Бразилии (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil) в 1993 году. Авторы языка — Роберту Иерузалимски (Roberto Ierusalimschy), Луиш Энрике ди Фигейреду (Luiz Henrique de Figueiredo) и Валдемар Селиш (Waldemar Celes).
Расширение файла LUA
Оглавление
Мы надеемся, что вы найдете на этой странице полезный и ценный ресурс!
2 расширений и 0 псевдонимы, найденных в базе данных
✅ World of Warcraft Interface Configuration
✅ LUA Source Code
Другие типы файлов могут также использовать расширение файла .lua.
По данным Поиск на нашем сайте эти опечатки были наиболее распространенными в прошлом году:
Это возможно, что расширение имени файла указано неправильно?
Мы нашли следующие аналогичные расширений файлов в нашей базе данных:
Если дважды щелкнуть файл, чтобы открыть его, Windows проверяет расширение имени файла. Если Windows распознает расширение имени файла, файл открывается в программе, которая связана с этим расширением имени файла. Когда Windows не распознает расширение имени файла, появляется следующее сообщение:
Windows не удается открыть этот файл:
Чтобы открыть этот файл, Windows необходимо знать, какую программу вы хотите использовать для его открытия.
Если вы не знаете как настроить сопоставления файлов .lua, проверьте FAQ.
🔴 Можно ли изменить расширение файлов?
Изменение имени файла расширение файла не является хорошей идеей. Когда вы меняете расширение файла, вы изменить способ программы на вашем компьютере чтения файла. Проблема заключается в том, что изменение расширения файла не изменяет формат файла.
Если у вас есть полезная информация о расширение файла .lua, напишите нам!
Русские Блоги
Ввод-вывод файла Lua
Ввод-вывод файла Lua
Библиотека ввода-вывода Lua используется для чтения и обработки файлов. Разделены на простой режим (такой же, как C) и полный режим.
Простой режим больше подходит для выполнения простых файловых операций. Но при выполнении некоторых расширенных операций с файлами простой режим оказывается неадекватным. Например, для таких операций, как одновременное чтение нескольких файлов, больше подходит полный режим.
Оператор операции с открытым файлом выглядит следующим образом:
| Режим | описание |
|---|---|
| r | Чтобы открыть файл только для чтения, файл должен существовать. |
| w | Откройте файл только для записи.Если файл существует, длина файла сбрасывается до 0, то есть содержимое файла исчезает. Если файл не существует, создайте файл. |
| a | Откройте файл только для записи в режиме добавления. Если файл не существует, он будет создан.Если файл существует, записанные данные будут добавлены в конец файла, то есть исходное содержимое файла будет сохранено. (Символ EOF зарезервирован) |
| r+ | Чтобы открыть файл в режиме чтения-записи, файл должен существовать. |
| w+ | Откройте файл, доступный для чтения и записи.Если файл существует, длина файла сбрасывается до нуля, то есть содержимое файла исчезает. Если файл не существует, создайте файл. |
| a+ | Подобен a, но этот файл доступен для чтения и записи. |
| b | Двоичный режим, если файл является двоичным файлом, вы можете добавить b |
| + | Знак указывает, что файл можно читать или писать |
Простой режим
В простом режиме используется стандартный ввод-вывод или текущий входной файл и текущий выходной файл.
Выполнив приведенный выше код, вы обнаружите, что первая строка информации в файле test.ua выводится, а комментарий lua добавляется к последней строке файла. Например, вот что я вывожу:
В приведенном выше примере мы использовали метод io. «X», где мы не брали параметры в io.read (), и параметр может быть одним из следующих:
| Режим | описание |
|---|---|
| «*n» | Прочтите число и верните его. Пример: file.read («* n») |
| «*a» | Прочитать весь файл с текущей позиции. Пример: file.read («* a») |
| «* l» (по умолчанию) | Прочтите следующую строку и верните ноль в конце файла (EOF). Пример: file.read («* l») |
| number | Возвращает строку с указанным количеством символов или возвращает ноль, если EOF. Пример: file.read (5) |
Полный режим
Обычно нам нужно обрабатывать несколько файлов одновременно. Нам нужно использовать file: function_name вместо метода io.function_name. В следующем примере показано, как обрабатывать один и тот же файл одновременно:
Выполнив приведенный выше код, вы обнаружите, что первая строка информации в файле test.ua выводится, а комментарий lua добавляется к последней строке файла. Например, вот что я вывожу:
Параметры чтения соответствуют простому режиму.
file:seek(optional whence, optional offset): Установить и получить текущую позицию в файле. В случае успеха возвращается окончательная позиция в файле (в байтах). В случае неудачи возвращается ноль плюс сообщение об ошибке. Параметр, откуда берется значение, может быть:
Без параметров file: seek () возвращает текущую позицию, file: seek («set») указывает на начало файла, file: seek («end») находит до конца файла и возвращает размер файла.
file:flush(): Записать все данные из буфера в файл
io.lines(optional file name): Откройте указанное имя файла в режиме чтения и верните итеративную функцию. Каждый вызов будет получать строку содержимого в файле. Когда он достигнет конца файла, он вернет nil и автоматически закроет файл.
Если параметр отсутствует, io.lines () io.input (): lines (); считывает содержимое устройства ввода по умолчанию, но не закрывает файл при конец, например
В следующем примере метод seek используется для поиска 25-й позиции снизу файла и используется параметр * a метода чтения для чтения всего файла с текущей позиции (25-я позиция снизу).
Язык Lua и Corona SDK (3/3 часть)
В этой заключительной третьей части большой обзорной статьи по языку Lua в Corona SDK будут рассмотрены очень важные вопросы, после изучения которых вы сможете перейти непосредственно к изучения Corona SDK.
Циклические операции
В любой языке и почти для любой задачи обязательно возникнет ситуация при которой некоторый участок кода необходимо выполнить несколько раз. Для этой задачи используются циклические операции. В языке Lua имеется 2 оператора позволяющих организовать циклы(for и while), далее я опишу их.
while (exp) do end
Код между do и end выполняется до тех пор пока результат выражения exp — истина (true). Приведу пример реализации цикла:
Переменной b мы до цикла устанавливаем значение true а дальше после достижения нужного состояния счетчика ставим b равное false и происходит выход из цикла. Существует способ создания цикла в формате while true do end при этом создается вечный цикл — это достаточно опасная ситуация и всегда нужно иметь устойчивые условия выхода из таких циклов, в Lua для этих целей имеется оператор break — этот оператор безусловно завершает выполнения цикла. Рассмотрим пример:
Не допускайте халатности при организации вечных циклов и в целом при использовании while. Не всегда можно точно предсказать, что в любой ситуации цикл будет завершен, а это приводит к глубокому зависанию приложения.
for (exp) do end
Код расположенный между do и end будет выполнять согласно правил установленных в exp. Цикл for имеет широкое распространение среди языком программирования, в Lua этот оператор можно применять двумя способами, ниже мы рассмотрим их. Первый и самый простой способ легко будет понятен любому пользователю знакомому с любым языком программирования:
В некоторых случаях увеличивать итератор необходимо не на единицу, а к примеру на 2 или 5, так же возможен вариант при котором вы хотите считать в обратную сторону. Это реализуется использование 3 параметра for, который определяет величину приращения за один шаг.
for [values] in (func) do end
Этот вариант цикла for уже рассматривался в прошлой части когда мы рассматривали функции string.gmath, pairs и ipairs. В Lua использование этого цикла можно считать большим удобством и не стоит его избегать, проще один раз разобраться и дальше делать многие вещи проще чем привычным способом свойственным в других языках. Еще раз приведу примеры применения этого типа циклической операции:
Буквально в следующем разделе при рассмотрении работы с файлами вы мы рассмотрим еще один вариант циклической функции в качестве аргумента цикла — file:lines.
Работа с файлами
Для работы с файлами в Corona SDK используется стандартная библиотека ввода-вывода Lua — io. Не все функции библиотеки имеют кроссплатформеную реализацию, так же не все функции в Corona SDK реализованы так же как это принято в Lua. Наряду с работой с файлами библиотеку io в Lua принято использовать для работы с консолью (если не указывать идентивфикатор файла), но в Corona SDK это действие будет происходить не совсем верно, приведу пример:
Это фрагмент кода в Lua работает так: выполняется первая строка в консоль выводится строка «A:», далее ожидается пока пользователь введет число и нажмет Enter, далее та же операция проходит с переменной B после чего происходит вывод результата суммирования. В Corona SDK не происходит остановка выполнения на второй и четвертой строке, и как следствие возникает ошибка на 5 строке при попытке сложить 2 переменные равные nil. Т.е. создание приложений принимающих параметры из консоли в Corona SDK не возможно, т.е. для работы с консолью остается использовать только io.write для вывода текста, но у этой функции есть прямой аналог — print. Из выше сказанное стоит сделать вывод, что для работы с консолью нет смысла использовать библиотеку io. Для работы с файлами библиотека годится, но опять же из-за сомнительной реализации в Corona SDK использовать библиотеку лучше самым очевидным и простым способом: «Открыл/Создал — Прочел — Записал — Закрыл». Так же при разработке в Corona SDK приходится учитывать что особую систему каталогов свойственную мобильным приложениям, именно с этого мы и начнем.
Каталоги доступные приложению
Все данные приложения находятся в изолированном от других приложении пространстве, имеется несколько каталогов:
В качестве второго параметра необходимо использовать одно из доступных значений: system.ResourceDirectory, system.DocumentsDirectory, system.TemporaryDirectory, system.CachesDirectory. Как уже выше говорилось значение по умолчанию для system.ResourceDirectory, т.е. если не указать второй параметр корнем пути будет считать каталог с файлом main.lua.
Многие функции в Corona SDK использую файлы для своей работы, например display.newImage загружает изображение из файла на экран устройства в этих функциях имя файла вводится отдельно от каталога:
Так как system. ResourceDirectory — значение по умолчанию, этот параметр можно не вводить, сократив тем самым запись:
Обратите внимание на 3 вещи:
Далее рассмотрим наиболее простые и приемлемые приемы работы с файлами. В этом уроке я не буду писать свой вариант перевода официальных справочных материалов их вы можете сами почитать как для Lua так и для короны, я постараюсь выдать вам самое нужное, а именно как сделать удобное хранение настроек проекта и реализовать работу с логами.
Создание/Запись/Чтение файла целиком
Реализуем простой пример, в котором файл создается и в него записывается строка:
Рассмотрим особенности. В функции io.open в качестве второго параметра используется особый флаг, который определяет тип доступа к файлу, рассмотрим основные флаги доступа:
Код библиотеки (libLoadSave.lua)
Порядок применения библиотеки следующий:
Создание/Запись/Чтение файла построчно
Рассмотрим вариант работы с файлами при котором будет выполняться следующая последовательность действий:
Так как мы рассматриваем этот пример намереваясь в последующем реализовать лог проекта, то обратите внимание на то что файл я храню в каталоге кеша, так же можно его хранить во временной директории. Это связано с тем что логи имеют наибольшую ценность как аппаратно зависимые данные, например на одном устройстве у вас есть ошибка а на другом нет, и синхронизация логов в общем порядке плохо скажется на их информативности. Хранение логов во временной папке дает возможность избежать существенного дрейфа размера занимаемого приложением (если хранить логи годами), так как при каждой перезагрузке приложения логи будут удаляться (это не всегда так, чаще логи удаляются при рестарте телефона либо в результате работы всяких «чистилок»).
Вторым шагом реализации логов будет рассмотрение способа построчного чтения файла — это пригодится для чтения данных из лога:
Теперь как и в прошлый раз реализуем удобный для переноса и повторного использования механизм логов. Сначала код библиотеки (libLog.lua):
Дата и время
Во многих развитых языках вроде C# или Delphi работа с датой и временем осуществляется за счет использования десятков готовых функций, которые с одной стороны все равно не могут предусмотреть всего и приходится что-то «допиливать», с другой стороны хрупкий мозг разработчика вынужден хранить в себе весь этот зоопарк возможностей. В Lua все предельно просто:
os.time()
В самом простом варианте функция вызывается без параметров и возвращает текущий системный timestamp(UNIX-время / POSIX — время) — это количество секунд, которое прошло с момента начала UNIX-эры (01.01.1970 в 00:00:00UTC).
В расширенном формате функция os.time способна вернуть timestamp любой точки времени после начала UNIX-эры, для этого необходимо передать функции в качестве параметра таблицу в специальном формате: date table. Ни чего «магического» в этой таблице нет ниже привожу ее описание:
year 1970-3000
month 01-12
day 01-31
hour 00-23
min 00-59
sec 00-59
isdst true если летнее время
Т.е. если заполнить эту таблицу и передать ее os.time функция вернет для установленного момента времени timestamp. Параметры год, месяц, день являются обязательными. Так же имеются временные рамки в пределах которых можно вводить параметры они простираются от начала UNIX-эры и до (31.12.3000 23:59:59UTC) если ввести выше и ниже этих пределов функция вернет nil. Пример кода:
Обратите внимание, параметры времени: час, минута, секунда по умолчанию используются значения 12:00:00. В таком применении функцию os.time удобно использовать для сравнения дат, это значительно удобней чем делать сложный обход по параметрам date table. Можно так же использовать результат этой функции для вычисления «сколько осталось до..» или «сколько прошло с..», единственным неудобством будет то что переводить из секунд в дни часы, минуты и секунды все же придется в ручную, но это не сложно. Приведу пример, который вычислить оставшееся время до Нового Года в днях часа минутах и секундах:
os.date
Не смотря на название, функция os.date является обратной функцией от os.time, т.е. из низкоуровневого формата timestamp она получает более высокоуровневый формат date table, в возвращаемом результате функции os.date имеются поля которые не требуются функции os.time это поля: yday — день года (1..365 или 366 для високосных годов) и wday — день недели (1 — Воскресенье, 2 — Понедельник… 7 — Суббота). Функция принимает 2 параметра:
os.clock
Часто в процессе создания приложения возникают проблемы с производительностью и не всегда просто понять какой конкретно фрагмент кода сильно нагружает все приложение, или например приводит к долгим запускам программы. Так же можно с помощью функции выбирать какой вариант реализации одной и той же функции выбрать. Функция os.clock — возвращает время в секундах (точность до 4 знака после запятой), которое потратил процессор на работая над приложением с момента старта приложения. Т.е. если свернуть приложение в память и не использовать его — отсчет времени будет приостановлен до возврата к приложению. Пример кода сравнивающего эффективность двух вариантов выполнения одной задачи, пример естественно шуточный (все и без тестов угадают что работает быстрей).
Функции
В процессе изучения этой статьи я не раз говорил о функциях и некоторые примеры имели их на борту, но качественный разбор этого понятия я решил перенести к концу статьи, так как имеющийся сейчас базис лучше подходит для пониманию некоторых тонкостей. Начнем с теории. Функция — фрагмент программного кода (подпрограмма), к которому можно обратиться из другого места программы. В большинстве случаев с функцией связывается идентификатор, но многие языки допускают и безымянные функции.
Анонимные функции
Lua допускает наличие безымянных (обезличенных, анонимных) функций — это повсеместно применяется в том случае, если одна функция требует в качестве одного из аргументов другую функцию и если этот фрагмент вам больше ни где не пригодится вы с легкой душой создаете анонимную функцию. Приведу пример:
Порядок объявления функций
Вы скорее всего уже заметили, но все же подытожу, функции в Lua можно объявлять двумя способами:
Присвоение ее значения переменной
Вы можете использовать любой способ, но лучше первый, так как небольшая разница есть — на момент инициализации модуля(файла) в нем единовременно выполняется весь локальный контекст, т.е. если вне функций имеются какие-то присвоения переменных, они будут один раз присвоены(функция объявленная как переменная будет инициализирована), если же объявить вторым путем функция будет инициализирована при первом использовании.
Порядок вызова функции
Функция вызывается путем указания ее имени и в скобках передачи параметров, если не указывать скобки функция просто будет хранить свой тип данных и адрес вызова, ты вы можете просто напечатать в print функцию и она при этом не вызовется:
Второй print ни чего не печатал, так как функция не имеет возвращаемых параметров. Есть еще один вариант организации вызова функции. В функциях может требоваться множество входных параметров и их можно либо передавать через запятую либо организовать функцию так что бы на входе она ожидала всего один параметр — table, а в нем в формате ключ = значение размещены все параметры:
На первый взгляд может показаться что 2 способ «какой-то длинный — писать много», но на практике он на много удобней, приведу аргументы в защиту «длинного способа», возможно удастся вас убедить что он хорош:
Возврат результатов
Тут все просто, что бы функция что-то вернула нужно в тот момент когда результат получен использовать оператор return после которого будет идти переменная (или несколько переменных). Как и в случае передачи параметров функции, так и в случае возврата результатов выполнения я бы вам рекомендовал использовать результирующие таблицы в которых размещены все результаты:
Регулярные выражения и захваты
С понятиями регулярных выражений и захватов вы сталкивались при изучении этой статьи уже несколько раз, в частности при изучении следующих функций: string.match, string.gmacth, string.sub, string.gsub, string.find. Как же это работает? Приведу самую малость терминов.
Регулярное выражение — это строка состоящая из последовательности символов определяющая шаблон разбора текстовой строки на составные части.
Регулярное выражение может состоять из управляющих конструкций, непрерывных последовательностей символов и захватов.
Управляющая конструкция — это шаблон регулярного выражения который может заменять собой один или несколько символов, т.е. например %d — это любое число. Полный список управляющих конструкций представлен ниже:
Непрерывная последовательность — это строгая последовательность символов, которая должна быть в строго определенном месте регулярного выражения. Приведем пример есть строка «param1: 1234, param2: 54321», используем следующее регулярное выражение для ее разбора «%d+»(означает любое количество идущих подряд символов, но не менее 1). Это регулярное выражение найдет строку «1234» и функция вернет результат, если же нам нужно получить значение именно второго параметра мы можем либо запустить поиск второй раз раз (используя соответсующий параметр функций), либо просто указать непрерывную последовательность символов, а именно «params2: » и регулярное выражение будет иметь вид: » params2: %d+», а если пойти дальше и это упростить откинув лишнее то останется «2: %d+». Стоит заметить что после уменьшения длины непрерывной последовательности увеличится универсальность регулярного выражения и при большем количестве параметров может произойти промах.
Захват — это помещение в переменную определенных частей строки путем разбора его регулярным выражением. Что бы организовать захват достаточно поместить некоторую часть регулярного выражения в круглые скобки «()». В одном регулярном выражении может быть множество захватов. Пример захвата: имеется исходная строка «ip:123.22.345.23«, необходимо извлечь все 4 числовые части ip адреса, применим следующее регулярное выражение в качестве аргумента функции string.match «ip:(%d+)%.(%d+)%.(%d+)%.(%d+)»код будет выглядеть примерно так:
Обратите внимание, что символ точки между захватами необходимо экранировать, так как этот символ является управляющей конструкцией и означает «любой символ«, если этого не сделать числа можно будет разделять любым символом а захват все равно будет работать. Имеются и другие символы, который в теле регулярного выражения необходимо экранировать вот их список:
ВАЖНО: В регулярных выражениях имеется строгая необходимость выполнения всех условий, т.е. если не выполнено хотя бы одно условие разбора строки весь захват не выполняется, и с все переменные получают значение nil.
Как сделать захваты более универсальными, например оставить возможность что третье число ip по какой-то причине будет отсутствовать? На самом деле все просто — сейчас мы используем в «+» в паре с управляющей конструкцией %d, а это предполагает наличие хотя бы одного числа, если убрать +, то условие будет такое — должен быть строго один символ, если же вместо «+» поставить символ «*» то условие будет — захват любого количества чисел включая ни одного. Проверяем:
Все отлично сработало. Переходим к следующему усложнению, что если в строке содержится число в шестнадцатиричном формате, т.е. по мимо цифр могут содержать символы abcdefABCDEF. Для этой задачи объединим несколько управляющих конструкций в одну с помощью «[]», управляющие знаки +* нужно вынести за квадратные скобки, или они то же будут считаться часть суммарной конструкции. Что бы не перечислять все символы(если есть символы идущие подряд) можно их можно сгруппировать и перечислить через дефис следующим образом «a-fA-F»
Теперь рассмотрим вариант упрощение этой регулярки. Попробуем идти от обратного т.е. искать не определенные символы, а захватывать все символы кроме завершающего символа, в данном случае «;». Как выше писалось, что бы инициировать инвертирование «все кроме» необходимо поставить символ крышки «^» перед управляющим символом. Так же для конкретно этого случая можно сильно упростить непрерывную последовательность перед захватом всего до «= «, если это не сделать будет захвачен первый символ строки «code» так как он тоже отвечает регулярной последовательности, а если поставить только пробел » » будет захвачен лишний фрагмент «= «.
Внутри захвата могу присутствовать как последовательности символом на несколько отдельных или сгруппированных управляющих конструкций, т.е. захваты такого вида тоже корректны:
Регулярные выражения в Lua являются серьезной часть системы и не редко позволяют значительно упростить многие вещи. Приведу несколько советов по порядку применения регулярных выражений:
Это выражение работает по следующему правилу:
Управление случайностью
Очень часто в реальных приложениях требуется внести некоторую случайность, например выбрать одно из заранее определенных значений или задать случайное направление, цвет и т.д. Для решения этих задач в большинстве языков имеется генератор псевдослучаных чисел.
Математически создать по настоящему случайную последовательность, пока что считается невозможным, есть аппаратные решения решающие эту задачу, но это отдельная история. В Lua генератор, для получения псевдослучайных чисел используется функция math.random(). Генератор действует по определенному алгоритму раз в какое-то время последовательность начинает повторятся, длина последовательности может быть достаточно большой, но есть минус каждый раз при запуске приложения последовательность начинается заново, т.е. если к примеру, при входе в приложение программа будем получать случайное число от 1 до 100, то каждый раз мы будем видеть один и тот же результат, если поставим это действие на вход в приложение:
Всегда будет получаться 1, это безусловно очень неудобно, в реальных задачах. В попытке решить эту проблему можно воспользоваться второй функцией предназначенной для управления math.random, эта функция math.randomseed — с помощью нее мы можем изменить первый шаг случайной последовательности и генерация будет начинаться не с единицы, а с другого (всегда одинакового) числа.
Теперь каждый раз при входе в приложение мы видим число 4. Что-то опять не так! Очевидно на вход генератора через math.randomseed нужно подавать не всегда один и тот же seed. Как это получить? Можно попробовать в качестве seed использовать уже известную функцию os.time(), в этом случае если входить в приложение реже чем раз в секунду мы будем получать разное число:
Если же хочется что бы смена seed происходила примерно в 10000 быстрей, можно воспользоваться таким способом:
Любознательный читатель разберет это пример сам.
На последок рассмотрим все варианты применения math.random
О БУДУЩЕМ: В процессе изучения Corona SDK мы будем экспериментировать с внесением энтропии в механизм генерации чисел, например получая сигналы флюктуаций с датчика акселерометра или других датчиков, это способ является по настоящему случайным, но не является математическим и так как время квантования (опроса) у всех датчиков составляет килогерцы, а выполнения цикла for (с небольшим числом команд) может занимать значительно меньше времени, проблемы с этим способом будут не менее существенными, нам придется либо замедлять цикл до времени квантования датчика, либо использовать дополнительные источники энтропии.
Хочется отметить, что в вопросах создания очень уж реалистичной случайности не стоит сильно себя терзать, даже знатный трудяга-математик Джон фон Нейман говаривал:
«Всякий, кто питает слабость к арифметическим методам получения случайных чисел, грешен вне всяких сомнений.»
Математические функции
В предыдущей разделе были описаны функции random и randomseed из библиотеки математических функций math. В этой библиотеке есть и другие функции которые рано или поздно вам пригодятся.
Бережное отношение к чужому.
В этой кратком и заключительном раздел мы поговорим вовсе не о том, что к машине взятой на прокат стоит относиться как к своей, речь пойдет о стандартных функциях языка. В этот момент я передумал добавлять в статью еще 2 раздела и удалил их, очень хочется закончить и выспаться:(. Во многих языках достаточно трудно испортить стандартные функции, в Lua — нет ни чего проще. Присвоим любой функции произвольное значение. Приведу пример:
Как видите испортить то не многое, что есть в этом языке очень просто. Зарезервированные слова вроде end,begin,then таким образом не испортить, а вот остальные функции совершенно беззащитны перед проявлением мелкой беспечности. Такие ошибки будет очень не просто найти, особенно если в проекте десятки тысяч строк и над ним работает куча людей. Могу лишь дать один совет всегда используйте редакторы кода с подсветкой кода Lua и желательно функций Corona SDK, и если то что вы решили сделать именем переменной или функции где-то уже используется — придумайте новое имя.
Если пример с инициализацией print вам кажется несколько «притянутым за уши«, приведу гораздо более реальный пример, который несет еще большие последствия и выявляется еще сложней.
Разработчик решил ввести в программе логический флаг присвоение истины(true) которому, будет разрешать печать в консоль отладочной информации. Не долго думая он решил что всякие транслит названия (вроде OTLADKA) для его проекта совершенно не годятся и назвал переменную debug. Присвоил переменной true, проверил что все работает и продолжил дальше разрабатывать, через час, день или больше кто-то из его коллег заметил что Corona SDK совсем сломалась и совершенно не выдает сообщения об ошибке, даже если пишешь в коде полный бред. Оказалось, что функция debug — это стандартная функция Lua, которая мало того что может пригодиться вам в отладке так еще и используется самой короной и ее устранение полностью ломает систему отладки ошибок проекта. Я думаю, это достаточно хороший пример подтверждающий идею, что необходимо бережное отношение к чужому…
Заключение
Если вы изучили все три части статьи то вы получили большую часть того что вам потребуется знать что бы уверенно создавать свои проекты на Corona SDK. Некоторые вопросы я рассмотрел слишком подробно, другим возможно уделил не достаточно внимание, где-то возможно я был не прав или не точен, но хочется верить что будут люди которым эта информация поможет. Многие вещи из дополнительных библиотек языка остались за рамками этой статьи это связано с тем что некоторым функциям Lua есть более приемлемая замена из функций Corona SDK. В следующих статьях мы будем изучать уже не Lua, а именно Corona SDK, т.е. тот функционал которого в чистом виде в языке нет. Вас непременно ждет множество статей в которым мы будем писать игры и делать другие полезные вещи.
Хочется выразить благодарность за помощь оказанную в написании статьи, тем людям которые комментируют и указывают на неточности, так же разработчикам движка, с которыми я имел честь общаться и консультироваться через их группы в соцсетях(VK и facebook) и Slack-канал(вход свободный).








