Введение в Луа
Как язык сценариев (интерпретируемый язык) Lua известен как скрипт с наивысшей производительностью и широко используется во многих местах, требующих производительности, таких как nginx, игровые скрипты, OpenResty и так далее. В моем агенте проекта логика обработки задач реализована с помощью lua-скрипта. Исполнитель задачи выбирает соответствующий lua-скрипт для выполнения задачи при получении задачи, отделяет ее от исполнителя и поддерживает горячее обновление.
Начало работы с Луа
Установить
Установка Lua очень проста, если это система Linux, она будетmake macosx test
заменить сделать тест linux
curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz
tar zxf lua-5.3.5.tar.gz
cd lua-5.3.5
make linux test
hello world
Начните с самого простого hello world
$ lua
Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
> print("hello world")
hello world
тип
nil
nil — это тип, который можно понимать как NULL. Его основная функция — различать любое другое значение. Присвоение nil глобальной переменной эквивалентно ее удалению.
boolean
Логический тип имеет два необязательных значения: false и true. Lua обрабатывает false и nil как false, а другие значения как true, в отличие от других языков сценариев, где нулевые числа и пустые строки также обрабатываются как true.
number
Числовой тип используется для представления действительных чисел, в Lua нет целочисленного типа, только тип double.
string
Lua полностью закодирован в 8-битном коде, а строки являются неизменяемыми значениями.
> str="hello world"
> print(str)
hello world
Lua также может использовать пару совпадающих квадратных скобок для разделения строки.
> str=[[
>> print("hello world")
>> hello world
>> ]]
> print(str)
print("hello world")
hello world
table
Тип таблицы реализует ассоциативный массив, который представляет собой массив со специальным методом индексации, который может быть проиндексирован целыми числами, строками или другими типами значений.На основе таблицы он может использоваться для представления обычных массивов, таблиц символов, коллекции, записи, очереди и т. д. Для других структур данных Lua также использует таблицы для представления модулей, пакетов и объектов.
array = {}
array[1]=1
array["2"]=2
array[3]="3"
function
В Lua функции используются как первоклассные значения, которые можно хранить в переменных, передавать другим функциям через параметры и использовать в качестве возвращаемых значений других функций.
local add = function(a,b)
return a+b
end
function add1(a,b)
return a+b
end
print(add(1,2))
выражение
оператор отношения
Как и другие языки, Lua поддерживает ,=,==,~=.
логический оператор
Логические операции бывают и, или и не. Для оператора and, если первый операнд ложен, возвращается первый операнд, в противном случае возвращается второй операнд. Для оператора or первый операнд возвращается, если первый операнд истинен.
Конкатенация строк
Можно использовать оператор .. (две точки)
print("hello".."world")
структура управления
if then else
a = 2
if a > 0 then
print("a is positive")
end
if then elseif then end
a = -1
if a > 0 then
print("a is positive")
elseif a <0 then
print("a is negative")
else
error("a is zero")
end
while
local i=1
local sum=0
while i < 10 do
sum = sum +i
i = i+1
end
print(sum)
for
числовое для
Синтаксис следующий: var меняется с exp1 на exp2, и каждое изменение принимает exp3 в качестве размера шага.Если не указано, размер шага по умолчанию равен 1. Символ # часто используется для указания длины массива.
for var=exp1,exp2,exp3 do
<execute>
end
Возьмем простой пример
local i=1
local sum=0
for i=1,10,1 do
sum = sum +i
i = i+1
end
print(sum)
Общий для
Базовая библиотека Lua предоставляет ipairs и пары, которые можно использовать для обхода коллекций. Разница между ними
- ipairs просто обходят значения в порядке возрастания индекса и прекращают обход, когда индекс прерывается. Он завершается, когда встречает nil, он может перейти только к первому нецелочисленному ключу, который появляется в коллекции.
- пары могут проходить по всем ключам в коллекции.
for i,v in ipairs(array) do
print(v)
end
for i,v in pairs(array) do
print(v)
end
метатаблица и метаметод
В Lua каждое значение имеет набор предопределенных операций.Через метатаблицу поведение значения может быть изменено для выполнения указанной операции перед лицом непредопределенной операции, предполагая, что элементы a и b являются обеими. тип таблицы и может определять, как вычислять выражение a+b через метатаблицу.
Ниже приведен простой пример добавления двух таблиц.
local string = require("string")
local format = string.format
//定义两个分数,fraction1为1/3,fraction2为2/3
local fraction1 = {denominator=3,numerator=1}
local fraction2 = {denominator=3,numerator=2}
//定义一个运算操作符
fraction_operator={}
//定义+的操作符重载
function fraction_operator.__add(f1,f2)
res = {}
res.denominator = f1.denominator * f2.denominator
res.numerator = f1.numerator * f2.denominator + f2.numerator * f1.denominator
return res
end
//为前面定义的两个table设置MetaTable
setmetatable(fraction1,fraction_operator)
setmetatable(fraction2,fraction_operator)
print(getmetatable(fraction1))
print(getmetatable(fraction2))
local fraction3 = fraction1 + fraction2
print(format("num:%d,den:%d",fraction3.numerator,fraction3.denominator))
Метаметод внутреннего соглашения Lua
__add(a, b) 对应表达式 a + b
__sub(a, b) 对应表达式 a - b
__mul(a, b) 对应表达式 a * b
__div(a, b) 对应表达式 a / b
__mod(a, b) 对应表达式 a % b
__pow(a, b) 对应表达式 a ^ b
__unm(a) 对应表达式 -a
__concat(a, b) 对应表达式 a .. b
__len(a) 对应表达式 #a
__eq(a, b) 对应表达式 a == b
__lt(a, b) 对应表达式 a < b
__le(a, b) 对应表达式 a <= b
__index(a, b) 对应表达式 a.b
__newindex(a, b, c) 对应表达式 a.b = c
__call(a, ...) 对应表达式 a(...)
Ссылаться на
Программирование на Lua, второе издание