前言

Lua 是一种强大、高效、轻量级、可嵌入的脚本语言。它支持过程式编程、面向对象编程、函数式编程、数据驱动编程和数据描述。我学习lua主要是看中lua完善的协程机制。

1 安装lua环境

安装过程比较简单,我的Ubuntu18.04默认安装了lua5.15版本 。我这里重新在官网下载了最新的lua版本5.4.4安装。

wget http://www.lua.org/ftp/lua-5.4.4.tar.gz
cd lua-5.4.4/
make
make test
make install

安装完成后直接运行lua,如果安装成功可以进入lua命令行模式

root@:/home/learn/lua_test# lua
Lua 5.4.4  Copyright (C) 1994-2022 Lua.org, PUC-Rio
>

退出方式简单记录一下

ctrl + c
ctrl + d
命令行输入:os.exit()

2 lua脚本

lua脚本命名采用的也是.lua结尾文件。
vi firstlua.lua代码如下

function printhello ()
    print("hello world")
end

打开命令行执行看效果:利用dofile函数将脚本加载到系统即可以调用脚本内部函数。

root:/home/learn/lua_test# lua
Lua 5.4.4  Copyright (C) 1994-2022 Lua.org, PUC-Rio
> dofile("firstlua.lua")
> printhello()
hello world

3 基本语法

3.1 lua关键字

下面是lua保留的关键字,注意关键字大小写敏感。

and       break     do        else      elseif    end
false     for       function  goto      if        in
local     nil       not       or        repeat    return
then      true      until     while

3.2 注释

注释语法

-- 行注释
--[[
多行注释
--]]

3.3 类型和值

官方规定的八种类型:nil(空)、boolean(布尔)、number(数值)、 string(字符串)、function(函数)、userdata(用户数据)、 thread(线程)和table(表)。
nil是一种只有一个nil值的类型,它的主要作用就是与其他所有值进行区分。
boolean在条件检测中Lua语言把零和空字符串也都视为真false或nil代表的是所有为假的值
and和or都遵循短路求值(Short-circuit巳valuation)原则,即只在必要时才对第二个操作数进行求值。and优先级高于or

3.4 math函数

三角函数:sin、cos、tan、asin
随机数:random
常量:pi、huge
取整:floor向下取整、ceil向上取整、modf向零取整
范围:maxinteger、mininteger

3.5 符号优先级

优先级从低到高

or
and
 <     >     <=    >=    ~=    ==
 |
 ~
 &
 <<    >>
 ..
 +     -
 *     /     //    %
 一元运算符 (not   #     -     ~)
 ^

3.6 字符串

长度计算

--利用#前缀
> print(#"hello")
5

多行字符串

> page = [[ <hello>
>> <world>]]
> print(page)
 <hello>
<world>

字符串函数

--复制
> string.rep("hello ", 3)
hello hello hello 
-- 翻转
> string.reverse("hello")
olleh
--转小写
> string.lower("Hello")
hello
--转大写
> string.upper("Hello")
HELLO
--求子集,取第一个到最后一个子集
> string.sub("Hello", 1, -1)
Hello
--ASCII转换
string.char和string.byte
--格式化
string.format("x = %d y = %d", 10, 20)
--找字符串
> string.find("Hello", "ll")
3       4
--找字符串并替换
> string.gsub("Hello", "ll", "--")
He--o   1
--utf8字符操作
> s = utf8.char(114, 222, 115, 116, 109)
> print(s)
rÞstm
> utf8.codepoint(s, 1, -1)
114     222     115     116     109

3.7 表

表(Table)是Lua语言中最主要和强大的数据结构。使用表,Lua语言可以以一种简单、统一且高效的方式表示数组、集合、记录和其他很多数据结构。

--表创建
> a = {}
--插入键值对
> a["x"] = 111
> a["x"]
111
> a[1] = "xxx"
> a[1]
xxx
--删除键值对
> a[1] = nil
> a[1]     
nil

表构造器

--自动添加索引
> week = {"mon", "tue", "wed", "thu", "fri", "sat", "sun"}
> week[3]
wed
--手动设置键值对
> test = {i = 1, j = 2}
> test.j
2

遍历表

> for k, v in pairs(week) do
>>     print(k, v)
>> end
1       mon
2       tue
3       wed
4       thu
5       fri
6       sat
7       sun

表标准函数

--插入
> table.insert(test, 1, 3)
> table.insert(test, 4)
> for k, v in pairs(test) do
>>     print(k, v)
>> end
1       3
2       4
j       2
i       1
--移除
> table.remove(test, 1)
3
--移动
> print(#t)
3
> table.move(t, 1, #t, 2)--移动第一个元素到最后一个元素到第二元素位置上,相当于新增一个元素
table: 0x555db8679ba0
> print(#t)
4

3.8 函数

可变参函数

function add(...)
    local s = 0
    for _, v in ipairs{...} do
        s = s + v
    end
    return s
end

print(add(1, 2, 3))

递归
lua特殊之处是尾调用不会占用栈空间,因此是无限的,不会出现栈溢出

function foo(n)
    if n > 0 then
        print(n)
        return foo(n -1)
    end
end
foo(5)

3.9 IO操作

--读取文件所有内容
f = assert(io.open("test.lua"), "r")
t = f:read("a")
print(t)
f:close()