Каждому языку нужно что-то, чтобы выделиться из толпы, что-то, что он делает лучше или даже иначе, чем остальные, чтобы его заметили. В этом посте будет рассказано о том, что действительно отличает Lua от нормы, и рассмотрены основные препятствия, которые Java-программисту необходимо преодолеть, чтобы эффективно использовать язык Lua. Темы: Структура оператора фрагмента, Таблицы, Функции и Сопрограммы.

Структура оператора блока

Даже новичок в языке Lua, вероятно, знает, что вам не нужно ставить точку с запятой в конце оператора. Но что может удивить некоторых программистов, так это то, что операторы Lua также не заканчиваются разрывами строк. Вместо этого Lua автоматически определяет, когда оператор является «завершенным», основываясь на синтаксисе. При использовании автономного интерпретатора Lua попытка отправить неполный оператор приведет к тому, что программа запросит у вас дополнительную информацию. На это указывает двойная угловая скобка (››) в начале строки. Когда вы предоставите полный оператор, интерпретатор выполнит ваш код, или, как это известно в Lua, ваш «чанк». На самом деле блок может быть намного больше, чем простое утверждение. Фрагменты исполняемого кода могут представлять собой целые файлы или даже длинную строку допустимых операторов, написанных в командной строке. Это позволяет вам выполнять столько кода, сколько вам нужно.

Столы

Несведущий Java-программист, скорее всего, взглянет на таблицы и подумает о массивах. В этом нет ничего плохого, поскольку таблицы можно использовать для массивов, но реальная сила таблиц заключается в том, что их можно использовать для гораздо большего. Таблицы на самом деле являются ЕДИНСТВЕННОЙ структурой данных в Lua и могут использоваться практически для всего, для чего вам понадобится структура данных. Это включает в себя массивы, списки, очереди, сопоставление значений ключа и даже пользовательские пакеты. Это связано с тем, что таблица не индексируется строго численно, хотя для массивов это делается автоматически. Таблицы можно индексировать с любым типом данных, доступным в Lua, за исключением nil. Таблицы также не имеют фиксированного размера, поэтому элементы можно свободно добавлять и удалять из таблицы. Стандартная библиотека таблиц обеспечивает еще большую функциональность для этих мощных объектов, поэтому хороший программист будет иметь все инструменты, необходимые для структурирования данных.

Функции

В Java вы бы назвали эти вещи методами, и они используются во многом для одних и тех же вещей. Тем не менее, есть пара важных вещей, на которые стоит обратить внимание. Во-первых, функции — это один из основных типов данных в Lua, и поэтому они назначаются переменным, как числа или строки. К счастью, для простоты использования функция также может быть определена в традиционном синтаксисе. Оба следующих определения идентичны.

function cube(num)
return num*num*num
end
cube = function(num)
return num*num*num
end

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

x,y,z = thisReturnsThree()

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

x = {thisReturnsMany()}

Корутины

Сопрограммы — это подход Lua к многопоточности. Когда создается новая сопрограмма, вы фактически порождаете небольшой побочный процесс, который будет иметь собственный стек, переменные и счетчик команд. Тем не менее, не обманывайтесь функциональностью, подобной потоку, потому что сопрограммы НЕ запускаются одновременно, как поток Java. Переключение управления сопрограммой осуществляется путем ручного вызова функции yield и последующего возобновления работы другой сопрограммы. Это ограничивает их полезность, но для них все же есть несколько полезных приложений.

Вывод

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