简介
lua 是一种开源、轻量的脚本语言,其设计目的是嵌入应用程序中,为应用程序提供灵活的扩展功能。
lua 特性
- 轻量级:解释器使用标准c语言编写,编译后仅仅一百余K,可以很方便的嵌入到应用程序中;
- 提供了易于使用的扩展接口、机制,扩展性强;
- 自动内存管理
- 功能丰富,支持闭包、协程、文件IO、数据库访问;
- 支持面向过程编程、面向对象编程、函数式编程。lua提供了通用类型的表(table),用它可以实现数组,哈希表,集合,对象以及实现面向对象编程。
Lua 应用场景
- 游戏开发
- 独立应用脚本
- Web 应用脚本
- 扩展和数据库插件,如:MySQL Proxy 和 MySQL WorkBench
- 安全系统,如入侵检测系统
环境配置
安装lua解释器:需要下载源码包,自行解压、编译,步骤可参考:https://www.lua.org/download.html。
win也可以直接下载、安装第三方提供的exe文件,包含了lua解释器、编辑器(IDE):https://github.com/rjpcomputing/luaforwindows/releases 只更新到了2018年。
基本语法
lua区分大小写
-- 单行注释
--[[
多行注释
多行注释
--]]
-- 可以 lua xxx.lua 执行lua脚本,也可以在lua脚本首行用 #! 指定解释器 ,然后 ./xxx.lua 执行脚本,会自动使用指定的解释器来执行文件
#!/usr/local/bin/lua
-- 输出,输出多个时英文逗号分隔
print("xxx")
print("xxx1", "xxx2")
变量
- lua是动态类型语言,变量不需要声明类型,会自动根据值确定类型,未初始化的变量 值为 nil。
- lua变量有三种类型:全局变量、局部变量、表中的域。默认为全局变量,语句块或是函数中默认也是全局变量,除非用 local 显式声明为局部变量。局部变量的作用域为从声明位置开始到所在语句块结束。
a = 5 -- 全局变量
function joke()
c = 5 -- 全局变量
local d = 6 -- 局部变量
end
-- nil
print(i)
-- 可以同时给多个变量赋值
a, b = 10, 20
-- 变量、值的数量要对应,否则后面的变量值为nil。eg. a=10,b=nil
a, b = 10
-- 交换2个变量的值
x, y = y, x
运算符
与其它语言相比,lua中需要注意以下运算符
运算符 | 说明 |
---|---|
// | 整除(直接舍弃小数部分,只保留整数) |
== 、~= | 等于、不等于 |
and、or、not | 逻辑运算符 |
… | 字符串连接符,eg. "hello "…“world” |
# | 一元运算符,获取字符串或table的长度,eg. #“张三” |
lua不支持自增 ++、自减运算符 –
数据类型
lua的8种基本数据类型
数据类型 | 描述 |
---|---|
nil | 空,表示一个无效值,可以把变量赋为 nil 来删除变量 |
boolean | 包含两个值:true、false,lua 会把 false、nil 看作是 false,其它的都为 true,数值0也会作为 true |
number | 数值型,lua默认只有双精度浮点数这一种数值类型 |
string | 单、双引、[[ ]]均可,[[ ]]类似于html的<pre>标签,用于标识一段字符串,不解析其中的特殊字符、原样展示 |
function | 函数,通常用 C、Lua 编写,可以作为参数,可以有0个或多个返回值,有多个返回值时用英文逗号分隔 |
table | 表,实质是一个关联数组,index可以是任意类型,不为nil即可。index为数值时可以作为数组,不同于其它语言 lua table 的 index 一般从1开始,index为其它类型时可以作为字典。table容量不固定,添加新数据时会自动扩容。 |
userdata | 表示任意存储在变量中的C数据结构 |
thread | 表示执行的独立线路,用于执行协同程序 |
字符串
常用方法可参考:https://www.runoob.com/lua/lua-strings.html
table 表
通过"构造表达式"来创建table
-- 创建一个空表
local table1 = {}
-- 创建时可以初始化数据
local table2 = {"apple", "pear", "orange", "grape"}
-- table的index可以是任意类型,index为数值型时可以作为数组(lua数组的index一般从1开始),index为其它类型时可以作为字典。可以通过 [key] 或 .key 访问table中对应的值
table1[1] = “chy”
table2["username"] = "chy"
-- table中不存在的key,对应的value是 nil
print(table2["xxx"])
for key, value in pairs(table2) do
print(key .. ":" .. value )
end
table常用方法可参考:https://www.runoob.com/lua/lua-tables.html
函数
lua的代码块(函数、if语句、循环语句)都不使用 { } 标识代码块,但都需要以end结尾,标识代码块的结束
function sum(m, n)
sum = m + n
print("sum=", sum)
return sum
end
-- 支持多个返回值,多个返回值时以英文逗号分隔
function hanle(m, n)
return m, n
end
-- 支持可变数量的参数
function test(a, ...)
print(a)
print(...)
--使用可变参数中的某个值
local args = {...}
print(args[1])
end
--函数可以作为参数
function handle(a, b, func)
result = func(a, b)
print(result)
end
--可以使用匿名函数
handle(1, 2,
function(a, b)
return a + b
end
)
常用语句
if
a = 60;
if(a >= 60) then
print("及格")
end
if(a >= 60) then
print("及格")
else
print("不及格" )
end
-- elseif 是连写的,中间没有空格
if( a >= 80 ) then
print("优秀" )
elseif( a >= 60 ) then
print("及格" )
else
print("不及格" )
end
while 循环
a = 10
while( a < 20 ) do
print("a的值为:", a)
a = a+1
end
repeat…until
相当于其它语言的 do…while
a = 10
repeat
print("a的值为:", a)
a = a + 1
until( a > 15 )
for循环
lua中的for循环可分为2类
- 数值for循环:指定3个参数,初始值、终止值、步长,初始值、终止值都包含,步长支持负数、可缺省,缺省时默认为1
- 泛型for循环:通过一个迭代器函数来遍历所有值,类似于其它语言的 foreach
-- 数值for循环
for i=1,10,2 do
print(i)
end
-- for循环的三个数值只在循环开始前一次性获取,循环过程中不再实时获取。比如下面的f(x)只会在循环开始前执行一次,循环过程中直接使用循环开始时获取的值
for i=1,f(x),2 do
print(i)
end
-- 泛型for循环,ipairs(arr) 可获取数组的迭代器
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
for index,ele in ipairs(days) do
print(index, ele)
end