Lua基本语法
Lua变量
变量
全局变量写法
a = 10
有2个脚本如下:main.lua, test.lua
-- main.lua
print("Hello Lua")
a = 15
dofile("luafile/test.lua")
-- test.lua
print(a)
PS:dofile 表示在一个脚本里面执行另外一个脚本,在脚本main.lua中声明的全局变量 a, 在脚本 test.lua 中可以直接使用。尽量使用本地变量,不要使用全局变量,lua有自动垃圾回收机制,本地变量出了作用域后内存会自动回收,而全局变量在内存中是一直存在的,如果反复定义同一个全局变量,可能就会出现内存泄漏。
执行结果:
本地变量写法
local a = 10
Lua数据类型
nil 空类型:
- 用于区分具有一些数据或没有数据的值
- 全局变量设为nil会交给垃圾回收
local a = nil
print(type(a)) --> nil
boolean 类型:
- 但要注意Lua中所有的值都可以作为条件
- 除了false和nil为假,其他值都为真,0为真
number 类型:
- Lua中没有整数,都是用浮点数运算
- 对应c的double类型
- 新版Lua中有基于64位的整形(5.1之后,ps:带来了性能的开销)
- tonumber转换格式
-- main.lua
print("Hello Lua");
local a = true;
local b = tonumber("1001")
print(type(a));
string 类型:
- tostring 转换格式
- [[]]多行字符串赋值
- “与c一样的转义"”
- …字符串拼接
print("Hello Lua");
local a = 123;
local b = tostring(a)
print(type(b));
多行字符串赋值 [[]]
-- main.lua
print("Hello Lua");
local a = 123;
local b = tostring(a)
local html = [[
<html>
</html>
]]
print(html);
字符串拼接 …
-- main.lua
print("Hello Lua");
local a = 123;
local b = tostring(a)
local html = [[
<html>
</html>
]]
html = "test1".."test2=".. a;
print(html);
string 处理
- 字符串长度 string.len
- 字符串子串 string.sub(str,3,5)
- 字符串查找 local b,e = string.find(str,“HEAD”) 支持正则
- 字符串替换 string.gsub(str,“HEAD”,“XCJ”) 支持正则
- ps:下标是从 1 开始的
-- main.lua
print("Hello Lua");
local a = 123;
local b = tostring(a)
local html = [[
<html>
</html>
]]
local n = nil;
local str = "test1".."test2=".. a;
print("string len = "..string.len(str));
--裁剪字符串
print("string sub = "..string.sub(str, 3, 5));
--查找字符串(这里返回了2个值)
local b,e = string.find(html,"html");
print("b = "..b.." e = "..e);
--替换字符串
local gsubstr = string.gsub(str,"te","ss");
print(gsubstr);
Lua控制结构语句
if 条件语句
-- if语句 用法示例
-- 判断符号:< > <= >= ~= ==
if((1==1 and 1==3) or 3==3) then
print("1 = 1")
elseif (2==2) then
print("2==2")
else
print("in else")
end
while循环语句
-- while语句 示例代码
-- ps: 没有 continue
local i = 100
while (not(i < 0)) do
print("i = "..i)
i = i - 1
if(i == 90) then
print("break while")
break
end
end
repeat 循环语句
--[[
repeat语句 示例代码
--]]
local i = 100
repeat
i = i + 1;
print("i = "..i)
until i > 110
for 循环语句
-- for循环语句 示例代码
-- 数值循环 从1到5,步数为1
-- ps:最后一个1代表步数,可以省略,默认为1
for var = 1,5,1 do
print("var = "..var)
end
-- 范型循环:pairs遍历全部 ipairs遍历数组
local tab = {[1] = "A", [2] = "B", [4] = "D"}
print("------------------------------------------ ipairs for tab")
-- ipairs 当做标准的数组来进行遍历访问,只能打印出1,2
-- ps:ipairs 效率更高
for i,v in ipairs(tab) do
print(i.."="..v)
end
print("------------------------------------------ pairs for tab")
-- pairs 遍历全部,可以打印出 1,2,4
for i,v in pairs(tab) do
print(i.."="..v)
end
Lua表和函数语法
Lua表处理
- 表的大小 tabel.getn(t1)
- 插入 table.insert(a,pos,line),ps:不传pos相当于push_back
- 删除 table.remove(a,pos) 返回这次删除的值,ps:不传pos相当于pop_back
-- 示例1
print("=========== tab1 ===========")
local tab1 = {"001", "002", "003"}
for i,v in ipairs(tab1) do
print("value = "..v)
end
print("=========== insert ===========")
table.insert(tab1,3,"002-2")
for i,v in ipairs(tab1) do
print("value = "..v)
end
print("=========== insert back ===========")
table.insert(tab1,"004")
for i,v in ipairs(tab1) do
print("value = "..v)
end
print("=========== remove ===========")
table.remove(tab1,3)
for i,v in ipairs(tab1) do
print("value = "..v)
end
print("=========== remove back ===========")
table.remove(tab1)
for i,v in ipairs(tab1) do
print("value = "..v)
end
print("-------------------------------------------------------")
-- 示例2(哈希表)
print("=========== tab2 ===========")
local tab2 = {id=123,age=20}
--插入
tab2["name"] = "xiaoming"
for k,v in pairs(tab2) do
print(k.." : ".. v)
end
print("=========== delete item ===========")
--删除
tab2["id"] = nil
for k,v in pairs(tab2) do
print(k.." : ".. v)
end
print("-------------------------------------------------------")
-- 示例3 (二维数组)
local tab3 = {}
tab3[1] = {"name1","name2"}
tab3[2] = {"value1","value2"}
for k,v in pairs(tab3) do
for k2,v2 in pairs(v) do
print("k2="..k2," v2="..v2)
end
end
Lua函数
函数语法
function func_name(arguments-list)
statements-list;
end;
参数
- 普通参数
-- defining the funciton
function test(p1,p2)
if(p1 == nil) then
p1 = "001"
end
if(p2 == nil) then
p2 = "002"
end
print("p1="..p1.." p2="..p2)
--可以返回多个值
return 1,"name"
end
-- calling the function
test(5,6)
- 可变参数
-- defining the funciton
function test(...)
local len = table.getn(arg)
print("args number = "..len)
for a=1,len do
print("arg"..a.." = "..arg[a])
end
end
-- calling the function
test(1,2,3)
- 函数传给变量
-- 把函数传给变量
local func = function(p1)
print("func = ".. p1)
end
func("key")
函数覆盖
-- 第一个test函数
function test(p1)
print("test 1")
end
-- 这个test函数将会覆盖掉上面的test函数
-- ps:别这么用
function test(p1,p2)
print("test 2")
end