Bootstrap

Lua使用指南


 

简介

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  
;