前言
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()