Lua常用语法
Lua基础数据类型如下
nil 只有值nil属于该类,表示一个无效值(判断为false)任何数据被赋值为nil时,相当于删除。
boolean 包含两个值:false和true。
number 表示双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由 C 或 Lua 编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table "关联数组",数组的索引可以是数字、字符串或表类型。最简单构造表达式是{}。可以理解为map
字符串连接打印需要使用…连接
print(k.."- - - -" ..v)
判断数字都是true
if 0 then
print("true")
else
print("false")
end
--不管是什么数字,都是true
循环的使用方法
tab1 = {key1="val1",key2="val2","val3"}
for k,v in pairs(tab1) do
print(k.."+ +"..v)
end
--使用tab1.key1=nil可以删除key1元素,val3的k会被默认赋值为1,但是不可调用。
数据在跟nil进行比较时,需要给nil加上引号
if (type(x)=='nil') then
print("true")
else
print("false")
end
--加引号输出true,不加输出false。type返回的是一个字符串nil。
#计算字符串长度
print(#"Hello World")
--结果为11。无法输出table的长度
Local关键字
带有local关键字的即为局部变量,而不带关键字的就是全局变量
Lua支持多个变量同时赋值,变量之间使用逗号隔开。变量个数和值个数不一致时,多余的使用nil替代。
索引:支持使用.或者[]。
Lua中的循环
while循环:条件为true时,让循环不断执行
while( true )
do
print("循环将永远执行下去")
end
for循环:重复执行指定语句,重复次数可在 for 语句中控制。
for i = 10, 1, -1 do
repeat
if i == 5 then
print("continue code here")
break
end
print(i, "loop code here")
until true
end
--这里的break并没有退出循环,内嵌有一个repeat。break只退出了repeat
repeat…until:重复执行循环,直到 指定的条件为真时为止
循环嵌套:可以在循环内嵌套一个或多个循环语句
控制语句break:退出当前循环或语句,并开始脚本执行紧接着的语句。
控制语句goto:将程序的控制点转移到一个标签处。
for i=1, 3 do
if i <= 2 then
print(i, "yes continue")
goto continue
end
print(i, " no continue")
::continue::
print([[i'm end]])
end
--goto语句,跳到标签处。可以实现continue。
--可以在lable中设置多个语句
::lable:: do
print(i)
i = i+1
end
Lua流程控制if语句:对表达式进行条件判断。为true继续执行
if(0)
then
print("0 为 true")
end
--if否面紧跟then
Lua函数
函数定义
local function max(num1,num2)
if (num1 > num2) then
result = num1;
else
result = num2;
end
return result;
end
--local可加可不加(局部和全局),function为函数关键字,max为函数名,num为函数参数
--return可以返回多个值(用逗号隔开),函数也可以作为参数传递
可变参数
function average(...)
result = 0
local arg={...} --> arg 为一个表,局部变量
for i,v in ipairs(arg) do
result = result + v
end
print("总共传入 " .. select("#",...) .. " 个数")
return result/select("#",...)
end
print("平均值为",average(10,5,3,4,5,6))
--select('#', …) 返回可变参数的长度。可变参数存在nil时仍会计算。
--而使用#{...}计算可变参数的长度时。遍历到nil,计算机会结束。
--select(i, ...)读取可变参数第i个参数
字符串
字符串常用操作
--字符串大写
string.upper(argument):
--字符串小写
string.lower(argument):
--字符串替换
string.gsub(mainString,findString,replaceString,num)
string.gsub("aaaa","a","z",3); -->zzza 3
--字符串查找
string.find (str, substr, [init, [end]])
string.find("Hello Lua user", "Lua", 1) -->7 9
--字符串反转
string.reverse(arg)
--返回一个类似print的格式化字符串
string.format("the value is:%d",4) -->the value is:4
--char 将整型数字转成字符并连接
string.char(97,98,99,100) --> abcd
--byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。
string.byte("ABCD",4) -->68(D的ASCLL码为68)
--字符串拷贝
string.rep("abcd",2) -->abcdabcd
--正则匹配,匹配不到则返回nil,继续匹配
for word in string.gmatch("Hello Lua user", "%a+") do
print(word)
end
--正则匹配,只返回第一个匹配结果 string.match(str, pattern, init)
string.match("I have 2 questions for 2 you.", "%d+ %a+") -->2 questions
字符串匹配模式、格式化等具体需要加强学习,不做展示。
Lua数组
Lua数组默认是以1开始的,当然也可以直接指定为0或者负数
array = {}
for i= -2, 2 do
array[i] = i *2
end
for i = -2,2 do
print(array[i])
end
-- 结果为:-4 -2 0 2 4
定义多维数组
array = {}
for i=1,3 do
array[i] = {}
for j=1,3 do
array[i][j] = i*j
end
end
Lua迭代器
泛型for迭代器
for k, v in ipairs(t) do
print(k, v)
end
Lua 模块与包
模块的结构就是一个 table 的结构,因此可以像操作调用 table 里的元素那样来操作调用模块里的常量或函数
-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
-- 定义一个常量
module.constant = "这是一个常量"
-- 定义一个函数
function module.func1()
io.write("这是一个公有函数!\n")
end
local function func2()
print("这是一个私有函数!")
end
function module.func3()
func2()
end
return module
require 函数
require("<模块名>") or require "<模块名>"