Что такое язык луа

Хочу всё знать. Язык Lua

Что такое язык луа. Смотреть фото Что такое язык луа. Смотреть картинку Что такое язык луа. Картинка про Что такое язык луа. Фото Что такое язык луа

Краткая справка

Lua бы придуман в 1993 году в Католическом университете Рио-де-Жанейро. Название переводится с португальского, как Луна, причем создатели убедительно просят не писать LUA, чтобы, не дай Бог, кто-нибудь не принял название за аббревиатуру. Является мультипарадигмальным скриптовым языком, использующим прототипную модель ООП.

По внешнему виду, да и возможностям Lua похож на очередную попытку переделать JavaScript, если бы не тот факт, что последний появился на два года позднее. Смотрите сами:

Начнем с традиционного:

function fact (n)
if n == 0 then
return 1
else
return n * fact(n-1)
end
end

Все предельно понятно. Кстати, в Lua поддерживается параллельное присваивание:

И в заключении довольно простой пример с использованием библиотек:

#include
#include
#include
#include
#include

int main (void) <
char buff[256];
int error;
lua_State *L = lua_open(); /* opens Lua */
luaopen_base(L); /* opens the basic library */
luaopen_table(L); /* opens the table library */
luaopen_io(L); /* opens the I/O library */
luaopen_string(L); /* opens the string lib. */
luaopen_math(L); /* opens the math lib. */

Преимущества и недостатки

Итак, чем же хорош Lua?

Во-первых, как уже было отмечено, своей компактностью, а вкупе с тем, что исходники написаны на С, вы получаете полное взаимодействие с одним из популярнейших языков на планете и широкий спектр доступных платформ.

Во-вторых, он быстрый. Если взглянуть на сравнительную характеристику с другими языками, то можно заметить, что хоть Lua и не укладывает на лопатки C или Python, но в некоторых тестах показывает отличные результаты.

В-третьих, он очень удобен для изучения даже не самыми опытными программистами. Наверняка даже те, кто просто знает английский язык, поняли минимум 80% описанного выше кода и без проблем смогут воспроизвести.

Любителей современных тенденций привлечет тот факт, что на Lua можно писать функциональный код.Да что там, если вы хотя бы пару недель уделите программированию на Lua, то наверняка найдёте ещё не один десяток плюсов.

Впрочем, не существует языков без недостатков, но у Lua они носят локальный характер. Так, например, язык по умолчанию не поддерживает Unicode, но это исправляется с использованием специальной ICU библиотеки. Или ограниченные возможности обработки ошибок и исключений, хотя многие сочтут это за благо. Или необходимость ставить оператор return исключительно последним в блоке, но опять-таки для многих это естественное правило хорошего кода.

Хотите стать веб-разработчиком? Тогда вам на наш курс обучения web-разработке!

Среды разработки

Что такое язык луа. Смотреть фото Что такое язык луа. Смотреть картинку Что такое язык луа. Картинка про Что такое язык луа. Фото Что такое язык луа

Полезные ссылки

Наш сегодняшний гость — настоящий боец скрытого фронта. Вы могли видеть его в играх (World of Warcraft, Angry Birds, X-Plane, S.T.A.L.K.E.R.) или продуктах компании Adobe (Lightroom), но даже не задумывались о его существовании. Между тем этому языку уже почти 25 лет и всё это время он незаметно делал нашу виртуальную жизнь чуть лучше.

Что такое язык луа. Смотреть фото Что такое язык луа. Смотреть картинку Что такое язык луа. Картинка про Что такое язык луа. Фото Что такое язык луа

Краткая справка

Lua бы придуман в 1993 году в Католическом университете Рио-де-Жанейро. Название переводится с португальского, как Луна, причем создатели убедительно просят не писать LUA, чтобы, не дай Бог, кто-нибудь не принял название за аббревиатуру. Является мультипарадигмальным скриптовым языком, использующим прототипную модель ООП.

По внешнему виду, да и возможностям Lua похож на очередную попытку переделать JavaScript, если бы не тот факт, что последний появился на два года позднее. Смотрите сами:

Начнем с традиционного:

function fact (n)
if n == 0 then
return 1
else
return n * fact(n-1)
end
end

Все предельно понятно. Кстати, в Lua поддерживается параллельное присваивание:

И в заключении довольно простой пример с использованием библиотек:

#include
#include
#include
#include
#include

int main (void) <
char buff[256];
int error;
lua_State *L = lua_open(); /* opens Lua */
luaopen_base(L); /* opens the basic library */
luaopen_table(L); /* opens the table library */
luaopen_io(L); /* opens the I/O library */
luaopen_string(L); /* opens the string lib. */
luaopen_math(L); /* opens the math lib. */

Преимущества и недостатки

Итак, чем же хорош Lua?

Во-первых, как уже было отмечено, своей компактностью, а вкупе с тем, что исходники написаны на С, вы получаете полное взаимодействие с одним из популярнейших языков на планете и широкий спектр доступных платформ.

Во-вторых, он быстрый. Если взглянуть на сравнительную характеристику с другими языками, то можно заметить, что хоть Lua и не укладывает на лопатки C или Python, но в некоторых тестах показывает отличные результаты.

В-третьих, он очень удобен для изучения даже не самыми опытными программистами. Наверняка даже те, кто просто знает английский язык, поняли минимум 80% описанного выше кода и без проблем смогут воспроизвести.

Любителей современных тенденций привлечет тот факт, что на Lua можно писать функциональный код.Да что там, если вы хотя бы пару недель уделите программированию на Lua, то наверняка найдёте ещё не один десяток плюсов.

Впрочем, не существует языков без недостатков, но у Lua они носят локальный характер. Так, например, язык по умолчанию не поддерживает Unicode, но это исправляется с использованием специальной ICU библиотеки. Или ограниченные возможности обработки ошибок и исключений, хотя многие сочтут это за благо. Или необходимость ставить оператор return исключительно последним в блоке, но опять-таки для многих это естественное правило хорошего кода.

Хотите стать веб-разработчиком? Тогда вам на наш курс обучения web-разработке!

Среды разработки

Источник

Язык программирования Lua

Lua — язык программирования (ЯП), который оснащен свободно распространяемым интерпретатором. По своей задумке он имеет некоторую схожесть с таким языком программирования, как JavaScript. Но в отличие от него Lua считается более гибким ЯП с мощными конструкциями.

Историческая справка

Разработчиком Lua является подразделение Tecgraf, которое располагается в Бразилии. Этот известный язык программирования был запущен в 1993 году. Над его разработкой трудились такие программисты, как Роберт Иерузалимски, Вальдемар Селиш, Луиш Энрике ди Фигейреду. Главная особенность языка — открытый код. Это говорит о то, что каждый желающий сможет поучаствовать в его развитии. Еще одна особенность Lua — его происхождение. Бразилия практически никогда не была замешана в сфере компьютерных разработок.

Прародителями Lua можно назвать два языка программирования — SOL, Del, которые также были выпущены подразделением Tecgraf. Заказчиком языка стала известная компания Petrobras. Последняя версия Lua — 5.4.0. Это обновление вышло во второй половине 2020 года. Несмотря на то, что этот ЯП считается достаточно взрослым, он активно продолжает использоваться в it-сфере, именно поэтому разработчики регулярно выпускают обновления ЯП, исправляют ошибки, вносят некоторые корректировки.

Общая характеристика

Язык программирования Lua применяется как отдельный или встроенный в приложение скриптовый язык. Изначально он был простым и компактным. Он должен был помещаться на исполнительных платформах и создавать хорошую производительность. Изначально разработчики языка желали сделать его простым в обучении, чтобы освоением могли заниматься не только профессионалы, но и начинающие программисты.

Сейчас Lua считается процедурным динамически модульным языком с автоматическим управлением памятью. В него входят базовые инструменты для поддержания различных стилей программирования. Lua также называют мультипарадигменным ЯП. Он дает возможность создавать многопоточные ПО без API и внешних библиотек.

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

Сегодня Lua также активно используется для создания игр. Это объясняется тем, что этот язык дает возможность быстро и легко программировать действия NPC. При помощи Lua можно программировать и иных персонажей. В этом случае поведение персонажей можно будет быстро менять без нагрузки на движок.

Язык программирования Луа применялся при написании интерфейса такой известной игры, как World of Warcraft. Известно, что этот ЯП применялся разработчиками и при создании многих других известных игр — Crysis, Far Cry, Stalker. Сегодня Lua также используется для создания ботов в мессенджере Telegram. Известно, что Википедия также будет использовать данный язык для MediaWiki.

Lua также используется в научных целях, например, его используют в центрах, которые занимаются исследованием космоса. Многие учебные заведения используют этот язык для создания внутренних программ. Известно, что в Бразилии Lua используется программистами практически повсеместно. Многие даже называют его местным государственным ЯП.

Код программы на ЯП Луа:

Факториал — пример рекурсивной функции:

funсtion fаctoriаl(n)
if n == 0 thеn
rеturn 1
else
return n * fаctoriаl(n — 1)
еnd
еnd

Цикл со счётчиком:

Какие главные преимущества и недостатки языка программирования Lua?

Lua имеет немало преимуществ, именно поэтому с ним работают многие компании:

У Lua есть и свои недостатки. Прежде всего этот язык считается скриптовым. Это говорит о том, что часто он используется в комбинации с другими языками программирования. Например, С. Самостоятельно Луа применяется не так часто. Поэтому программистам для полноценной работы потребуется изучить еще 1-2 языка программирования.

Мнения критиков

Вокруг этого языка программирования всегда было немало споров. Многие критики неоднократно обсуждали тот факт, что Луа разработан для работы с С, а не с С++. Это действительно так. Но при помощи некоторых библиотек программисты могут встраивать Lua и в С++. Такой принцип программирования, конечно, имеет свои недостатки. Но, несмотря на это, сегодня с ним продолжают работать многие специалисты.

Многие критики подвергали сомнению и скорость языка. Луа считался более медленным Яп, чем его конкуренты. На самом же деле, все эти убеждения оказывались ошибочными. Луа работает с какой-либо логикой, поэтому рабочий процесс здесь замедлять просто нечему.

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

Дальнейшие перспективы

Разработка игр считается весьма перспективным направлением в наши дни. Игровая индустрия развивается ежегодно, поэтому языки программирования в этом случае востребованности своей не теряют. Однако Луа не считается самым популярным ЯП в игровой сфере.

Если ориентироваться на индекс Tiobe, он занимает только 30 место. Впереди него находятся такие известные языки, как Java, Python, C. Это объясняется тем, что несмотря на востребованность в игровой сфере, Lua практически никогда не используется в одиночку. Луа необходим для создания лишь отдельных игровых компонентов. Используя только этот язык программирования, нельзя полностью создать полноценную игру.

Стоит также отметить, что современные компании все меньше и меньше нуждаются в работе разработчиков Lua. Эта вакансия становится все менее востребованной в it-сфере. Несмотря на это, существует немало желающих занять вакансию lua разработчика, если таковая имеется в определенных компаниях. Поэтому специалисты рискуют столкнуться с немалой конкуренцией при трудоустройстве.

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

Синтаксис языка

Принцип синтаксиса Луа основывается на принципе таких языков, как Модула-2 и Оберон. Запись текста происходит в свободном формате. Разделение команд происходит пробельными символами. Иногда для разделения используется точка с запятой.

Один из рзработчиков языка, Роберт Иерузалимски, объяснял в одном из своих интервью то, что синтаксис Луа можно назвать компромиссным решением. Разработчики хотели, чтобы Lua могли осваивать не только профессионалы, но и начинающие специалисты, поэтому язык так легко учится и имеет весьма упрощенный синтаксис.

Лексика

Главным алфавитом ЯП Луа считается английский язык. В строковых литералах применяются символы из других ЯП. Идентификаторы состоят из букв, цифр, символа подчеркивания. Они никогда не начинаются с цифры и не имеют совпадений с одним из ключевых слов. Если обратиться к материалу по использованию Lua, то можно отметить, что разработчики не советуют работать с идентификаторами, которые начинаются с подчеркивания. Это обусловлено тем, что эти символы преимущественно необходимы для системных целей.

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

Что такое язык луа. Смотреть фото Что такое язык луа. Смотреть картинку Что такое язык луа. Картинка про Что такое язык луа. Фото Что такое язык луа

Типы данных

Луа считается языком программирования, который имеет неявное динамическое обозначение типов данных. Переменная в этом случае содержит значения любого типа. Значения в этом ЯП могут оставаться в переменных. При этом они используются как аргументы в случае вызова функций, а затем приходят на исходные позиции в качестве результата их выполнения. В языке программирования Луа имеется 8 главных типов.

Оператор присваивания (ОП)

ОП в Луа называют символ =. В этом языке программирования возможно использование параллельного присваивания, как и в других ЯП. Допустим, Python, Icon. В самом простом случае это позволяет создавать выражения такого вида:

Что такое язык луа. Смотреть фото Что такое язык луа. Смотреть картинку Что такое язык луа. Картинка про Что такое язык луа. Фото Что такое язык луа

Если сравнить Луа с языком программирования Go, то станет ясно, что параллельное присваивание в Луа происходит проще. В этом случает не требуется полное соответствие числа переменных количеству значений. К примеру, если число значений и переменных разнится, то данные переменных могут отбрасываться (если значений больше). В обратном случае будет присваиваться тип nil.

Таблицы

Таблицы в Луа называют динамическим ассоциативным массивом. Иными словами, это большое количество пар, которые имеют вид «ключ-значение». В такой ситуации ключом может быть значение любых видов Луа, кроме nil. Иногда ключи бывают литералами. При записи nil в элементы таблицы подобное действие будет равносильно удалению выбранного элемента. Таблицы в Lua — это единственный составной тип данных. Их можно назвать базой и основой для всех пользовательских баз данных.

Что такое язык луа. Смотреть фото Что такое язык луа. Смотреть картинку Что такое язык луа. Картинка про Что такое язык луа. Фото Что такое язык луа

Мультимножества создаются подобно массивам. Однако в этом случае в качестве значений берутся не логические, а целые числа соответствующих компонентов в множестве. Списки в это случае представляются в качестве массивов двухэлементных массивов, которые будут хранить значения и ссылку на другие компоненты.

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

Метатаблицы

Метатаблицы в языке программирования Луа дают многие опции. По своим свойствам они похожи на обычные таблицы в Луа, которые имеют возможность соответствовать всем правилам и нормам. Главная особенность метатаблиц заключается в их использовании Этот элемент хранит различные метаданные типов и объектов.

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

Метатаблица в Луа связывается со значениями любого типа. Если речь идет о скалярных данных, то все они имеют цельные метатаблицы для любых видов. Значения типа userdata располагают индивидуальными ссылками на метатаблицы. Изменение метатаблиц всех видов происходит при помощи внешнего кода на С. Таким образом, из Луа будут доступны только метатаблицы таблиц.

Если сделать на этом языке программирования таблицу с самого начала, она не будет иметь метатаблицы. При этом метатаблицу в таком случае можно будет создать от других таблиц. За счет опции getmetatable происходит возвращение метатаблицы таблицы t.

При помощи опции setmetatable происходит установка для таблицы t метатаблицы m. Для метатаблиц в ЯП Луа предоставлен набор полей. Они могут применяться как интерпретатор языка. Чтобы указывать на особую роль имеющихся полей, для них используется правило именования. В этом случае идентификаторы начинаются с двух подчеркиваний.

Отдельные поля содержат данные о специфических свойствах объекта, в котором находится метатаблица. В Луа есть элемент, который обозначается как __mode. Если он будет задан, то таблица может стать слабой. При этом все ссылки на объекты тоже станут слабыми.

По значениям большей части доступных полей метатаблицы называют метаметодами. Это говорит о том, что имеются ссылки на функции, которые иногда вызывают интерпретаторы. Принцип работы метаметода выглядит так — при встрече интерпретатором в программе он будет обращен к связанной с операндом метатаблице. Далее он ищет необходимый метаметод и приводит его к вызову.

—[[ Создание операции сложения для таблиц ]]
— Операнды
t1 = <1,2,3>
t2 = <10,20,30>
— Создание метатаблицы
mt = <>
— Запись в метатаблицу метаметода «__add»
mt.__add = function(a, b)
local res = <>
for k in pairs(a) do res[k] = a[k] + b[k] end
return res
end
— Привязка метатаблицы к таблице t1
setmetatable(t1, mt)

В языке программирования Луа могут применяться все метаметоды для разных арифметических операций. Именно поэтому при помощи Lua можно проводить арифметику для любых объектов. В процессе идет работа как со стандартными, так и с библиотечными метаметодами (их поддержка происходит не ядром ЯП, а определенными библиотеками).

Главное значение в этом случае дает поле __index. Оно используется в тех случаях, когда интерпретатор читает данные таблицы, не может его найти.__index позволяет опираться на таблицы или на методы. Если происходит ссылка на таблицу, то интерпретатор найдет искомый элемент в таблице __index. В ином случае вместо работы с таблицей произойдет вызов этого метода. В Луа имеется возможность реализации наследования, анализа операций с таблицами.

Объектно-ориентированное программирование

Таблицы в языке программирования — это база для объектно-ориентированного программирования. Их можно назвать объектом в ООП. Это объясняется тем, что она имеет поля, которые именуются за счет идентификаторов. При этом таблицы хранят в полях произвольные значения и опции для осуществления поведения объекта. Некоторые синтаксические возможности языка программирования Луа дают описание и обращение с объектами более доступными для пользователей.. которые хорошо знают традиционные языки.

Программисты должны учитывать, что такого понятия, как «класс», в Луа не существует. В этом случае происходит описание отдельных компонентов, при этом все поля и методы будут относиться конкретно к нему.

Описание свойств происходит таким способом, как элементы таблицы с ключами. Методы в этом случае будут использоваться как поля-функции. Описание методов включает в себя указание в элементе «получателя». Этот тот элемент, который в случае вызова метода будет ссылаться на объекты, из-за которых и произошел вызов.

Что такое язык луа. Смотреть фото Что такое язык луа. Смотреть картинку Что такое язык луа. Картинка про Что такое язык луа. Фото Что такое язык луа

Реализация

Реализация в ЯП Луа имеет компилятор с исходного языка и виртуальную машину, которая приводит к работе сгенерированного байт-кода. Байт-коды в этом случае не являются командой сетевой машины. Они представлены как команды виртуального процессора с разными регистрами. Подобный процесс приводит к повышению эффективности исполнения.

В языке программирования Луа применяется единый строковый пул. Подобные действия снижают расход памяти на хранение строк. Если происходит работа с задачами, которые критичны по времени, имеется JIT-компилятор Луа. Также существует компилятор IIvm-lua, он имеет свойство генерировать код для виртуальной машины LLVM. Она переводит последующие компиляции в машинный код.

Работа с ошибками

Луа считается дополнительным языком, которые используется совместно с другими языками программирования. Все действия Луа берут свое начало из кода С в хвост-программе. Если происходит ошибка в процессе компиляции или в ходе выполнения порции Луа-кода, управление перейдет к хосту, который, в свою очередь, может выполнить соответствующие меры.

Допустим, дать сообщение об ошибке. Код Луа явно генерирует ошибки, вызывая при этом опцию error. При необходимости искать ошибки в языке программирования необходимо применять pcall или xpcall. Это необходимо для вызова функции в режиме защиты.

Что такое язык луа. Смотреть фото Что такое язык луа. Смотреть картинку Что такое язык луа. Картинка про Что такое язык луа. Фото Что такое язык луа

При обнаружении ошибки происходит распространение ее объекта. Он называется error message. Таким образом, язык программирования Луа генерирует только ошибки, чьим объектом называется строка. Программы при этом генерируют ошибки с любым значением в качестве объекта ошибки.

Если программист применяет xpcall и lua_pcall, ему можно задавать обработчик сообщений, который называется message handler. Он необходим для того, чтобы в дальнейшем получать сообщения об ошибках. Вызов этой опции происходит с исходным сообщением об ошибке. Возвращение в этом случае осуществляется с новым сообщением об ошибке. Подобная опция вызывается до того, как ошибка развернет стек. Таким образом, можно собрать больше сведений об ошибке.

Что такое язык луа. Смотреть фото Что такое язык луа. Смотреть картинку Что такое язык луа. Картинка про Что такое язык луа. Фото Что такое язык луа

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

Источник

Santa Simplicita

Просто писать о простом — не так и просто…

Lua за 60 минут

Я сентиментальный программист. Иногда я влюбляюсь в языки программирования, и тогда я могу говорить о них часами. Одним из этих часов я поделюсь с вами.

Lua? Что это?

Lua — простой встраиваемый язык (его можно интегрировать с вашими программами, написанными на других языках), легкий и понятный, с одним типом данных, с однообразным синтаксисом. Идеальный язык для изучения.

Зачем?

Lua может вам пригодится:

* если вы геймер (плагины для World of Warcraft и множества других игр)
* если вы пишете игры (очень часто в играх движок пишут на C/C++, а AI — на Lua)
* если вы системный программист (на Lua можно писать плагины для nmap, wireshark, nginx и других утилит)
* если вы embedded-разработчик (Lua очень быстрый, компактный и требует очень мало ресурсов)

Что надо для того, чтобы читать дальше?

1. Научитесь программировать. Хотя бы немного. Не важно на каком языке.
2. Установите Lua. Для этого либо скачайте здесь версию 5.2 (http://www.lua.org/download.html), либо ищите ее в репозиториях. Версия 5.1 тоже пойдет, но знайте, что она очень старая.

Все примеры из статьи запускайте в терминале командой наподобие «lua file.lua».

Первые впечатления

Lua — язык с динамической типизацией (переменные получают типы «на лету» в зависимости от присвоенных значений). Писать на нем можно как в императивном, так и в объектно-ориентированном или функциональном стиле (даже если вы не знаете как это — ничего страшного, продолжайте читать). Вот Hello world на Lua:

Что уже можно сказать о языке:

* однострочные комментарии начинаются с двух дефисов «—»
* скобки и точки-с-запятыми можно не писать

Операторы языка

Набор условных операторов и циклов довольно типичен:

В выражениях можно использовать такие вот операторы над переменными:

= (не-равно, да-да, вместо привычного «!=»)
* конкатенация строк (оператор «..»), напр.: s1=»hello»; s2=»world»; s3=s1..s2
* длина/размер (оператор #): s=»hello»; a = #s (‘a’ будет равно 5).
* получение элемента по индексу, напр.: s[2]

Битовых операций в языке долгое время не было, но в версии 5.2 появилась библиотека bit32, которая их реализует (как функции, не как операторы).

Типы данных

Я вам соврал, когда сказал что у языка один тип данных. Их у него много (как и у каждого серьезного языка):

* nil (ровным счетом ничего)
* булевы числа (true/false)
* числа (numbers) — без деления на целые/вещественные. Просто числа.
* строки — кстати, они очень похожи на строки в паскале
* функции — да, переменная может быть типа «функция»
* поток (thread)
* произвольные данные (userdata)
* таблица (table)

Если с первыми типами все понятно, то что же такое userdata? Вспомним о том, что Lua — язык встраиваемый, и обычно тесно работает с компонентами программ, написанными на других языках. Так вот, эти «чужие» компоненты могут создавать данные под свои нужды и хранить эти данные вместе с lua-объектами. Так вот, userdata — и есть подводная часть айсберга, которая с точки зрения языка lua не нужна, но и просто не обращать внимания на нее мы не можем.

А теперь самое важное в языке — таблицы.

Таблицы

Я вам снова соврал, когда сказал, что у языка 8 типов данных. Можете считать что он один: всё — это таблицы (это, кстати, тоже неправда). Таблица — это очень изящная структура данных, она сочетает в себе свойства массива, хэш-таблицы («ключ»-«значение»), структуры, объекта.

ПОДУМАЙТЕ: чему равно a[2] в случае разреженного массива?

В примере выше таблица ведет себя как массив, но на самом деле — у нас ведь есть ключи (индексы) и значения (элементы массива). И при этом ключами могут быть какие угодно типы, не только числа:

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

А как же объекты? О них мы узнаем чуть позже, вначале — о функциях.

Функции

Вот пример обычной функции.

Функции языка позволяют принимать несколько аргументов, и возвращать несколько аргументов. Так аргументы, значения которых не указаны явно, считаются равными nil.

ПОДУМАЙТЕ: зачем может понадобиться возвращать несколько аргументов?

Функции могут принимать переменное количество аргументов:

Поскольку функции — это полноценный тип данных, то можно создавать переменные-функции, а можно передавать функции как аргументы других функций

Объекты = функции + таблицы

Раз мы можем сохранять функции в переменных, то и в полях таблиц тоже сможем. А это уже получаются как-бы-методы. Для тех, кто не знаком с ООП скажу, что основная его польза (по крайней мере в Lua) в том, что функции и данные, с которыми они работают находятся рядом — в пределах одного объекта. Для тех, кто знаком с ООП скажу, что классов здесь нет, а наследование прототипное.

Перейдем к примерам. Есть у нас объект, скажем, лампочка. Она умеет гореть и не гореть. Ну а действия с ней можно сделать два — включить и выключить:

А если лампочку сделать объектом, и функции turn_off и turn_on сделать полями объекта, то получится:

Мы вынуждены передавать сам объект лампочки в качестве первого аргумента, потому что иначе наша функция не узнает с какой именно лампочкой надо работать, чтобы сменить состояние on/off. Но чтобы не быть многословными, в Lua есть сокращенная запись, которую обычно и используют — lamp:turn_on(). Итого, мы уже знаем несколько таких упрощений синтаксиса:

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

Специальные функции

Некоторые имена функций таблиц (методов) зарезервированы, и они несут особый смысл:

Собственно, мы еще можем заменить функцию print с помощью «print = myfunction», да и много других хакерских дел можно сделать.

Области видимости

Переменные бывают глобальные и локальные. При создании все переменные в Lua являются глобальными.

Для указания локальной области видимости пишут ключевое слово local:

Не забывайте об этом слове.

Обработка ошибок

Часто, если возникают ошибки, надо прекратить выполнение определенной функции. Можно, конечно, сделать множество проверок и вызывать «return», если что-то пошло не так. Но это увеличит объем кода. В Lua используется что-то наподобие исключений (exceptions).

Ошибки порождаются с помощью функции error(x). В качестве аргумента можно передать все, что угодно (то, что имеет отношение к ошибке — строковое описание, числовой код, объект, с которым произошла ошибка и т.д.)

Обычно после этой функции вся программа аварийно завершается. А это надо далеко не всегда. Если вы вызываете функцию, которая может создать ошибку (или ее дочерние функции могут создать ошибку), то вызывайте ее безопасно, с помощью pcall():

Стандартные библиотеки

Стандартных библиотек мало, зато это позволяет запускать Lua где угодно. Подробнее можно получить их список здесь — http://www.lua.org/manual/5.2/manual.html

Нестандартных библиотек много, их можно найти на LuaForge, LuaRocks и в других репозиториях.

Между Lua и не-Lua

ВНИМАНИЕ: эту часть рекомендуется читать людям со знанием языка C.

А если нам недостаточно функциональности стандартных библиотек? Если у нас есть наша программа на C, а мы хотим вызывать ее функции из Lua? Для этого есть очень простой механизм.

Допустим, мы хотим создать свою функцию, которая возвращает случайное число (в Lua есть math.random(), но мы хотим поучиться). Нам придется написать вот такой код на C:

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

А если мы хотим вызывать код, написанный на Lua из наших программ? Тогда наши программы должны создавать виртуальную машину Lua, в которой и будут выполняться Lua-скрипты. Это намного проще:

Вы теперь можете писать на Lua. Если вы узнаете интересные моменты про Lua, которые можно было бы отразить в статье — пишите!

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *