Начало работы с Луа

Lua

Введение в Луа

Как язык сценариев (интерпретируемый язык) 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(...)

Ссылаться на

классная оболочка.cai/articles/10…

Программирование на Lua, второе издание