目录
5.3 repeat until循环(do...while)
11.数组(在 Lua 中索引值默认是以 1 为起始,但你也可以指定 0或其他值 开始。)
1.Lua安装
Lua下载路径:https://github.com/rjpcomputing/luaforwindows/releases
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
C#都要编译成dll才能运行,而lua可以直接把源文件放到程序里边。
lua语句可不写分号“;”
2. 注释
单行:-- 多行:--[[ --]]
3.Lua中的数据类型
Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。
print(type("helloWorld"))
print(type(10))
print(type(1.1))
print(type(print))
print(type(type))
print(type(nil))
print(type(x))
3.1 nil(空)
nil 类型表示一种没有任何有效值,它只有一个值 -- nil
对于全局变量和 table,nil 还有一个"删除"作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉
tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
print("--------------")
tab1.key1 = nil
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
3.2 boolean(布尔)
boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是"假",其他的都为"真":
if false or nil then
print("至少有一个是 true")
else
print("false 和 nil 都为 false!")
end
print("-------------")
print(type(true))
print(type(false))
print(type(nil))
3.3 number(数字)
Lua 默认只有一种 number 类型 -- double(双精度)类型(默认类型可以修改 luaconf.h 里的定义),以下几种写法都被看作是 number 类型:
print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))
3.4 string(字符串)
Lua中,“+”只能做加法运算,不能做字符串组拼,字符串组拼用“..”
str1="this is string1"
str2="this is string2"
print("2".."6")
print("2"+"6")
print("2"+6)
print("2+6")
print("2e2"*"6")
print("--------")
print(#str1)
3.5 table(表)
在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表:
tab1 = {} -- 创建一个空的 table
print(tab1)
print(tab1.key)
print("--------------")
tab1.key1="lijiang"
tab1["key2"]="lijiang"
tab1[10]=1000
print(tab1.key1)
print(tab1["key1"])
print(tab1.key2)
print(tab1["key2"])
print(tab1[10])
print(tab1[2])
print("--------------")
print(tab1[1])
tab1[1]=100
print(tab1[1])
print(tab1["key1"])
print("--------------")
tab2={key1=100,key2="value2"}
print(tab2.key1)
print(tab2["key1"])
print(tab2[1])
print(tab2["1"])
print("--------------")
tab3 = {"apple", "pear", "orange", "grape"} -- 直接初始表
print(tab3[2])
print(tab3["2"])
print(tab3["pear"])
print(tab3["key2"])
Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。
a = {}
a["key1"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
print(k .. " : " .. v)
end
不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
print("Key", key)
end
table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。
a3 = {}
for i = 1, 10 do
a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])
3.6 function(函数)
在 Lua 中,函数是被看作是"第一类值(First-Class Value)",函数可以存在变量里:
function factorial1(n)
if n == 0 then
return 1
else
return n * factorial1(n - 1)
end
end
print(factorial1(4))
factorial2 = factorial1
print(factorial2(4))
function 可以以匿名函数(anonymous function)的方式通过参数传递:
function testFun(tab,fun)
for k ,v in pairs(tab) do
print(fun(k,v));
end
end
tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--匿名函数
return key.."="..val;
end
);
4.全局变量
变量在使用前,必须在代码中进行声明,即创建该变量。
Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束。
变量的默认值均为 nil。
全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。
print(b)
b=10
print(b)
如果你想删除一个全局变量,只需要将变量赋值为nil。
b=nil
print(b)
这样变量b就好像从没被使用过一样。换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。
多变量同时赋值
a, b, c = 0, 1
print(a,b,c)
a, b = a+1, b+1, b+2
print(a,b)
a,b=b,a
print(a,b)
a, b, c = 0
print(a,b,c)
print("------------")
function test()
return 10,20
end
a,b=test()
print(a,b)
5.Lua 循环
5.1 while循环
格式:
while (condition) do
statements
end
a=1
while (a<5) do
print(a)
a=a+1
end
5.2 for循环
1.数值for循环
格式:(这里var会从start变化到end,每次变化step。step默认为1)
for var=start,end,step do
循环体
end
for i=1,10,2 do
print(i)
end
2.泛型for循环
tab1={key1="lijiang",key2=10}
for k,v in pairs (tab1) do
print(k,v)
end
5.3 repeat until循环(do...while)
a=1
repeat
print(a)
a=a+1
until(a>5)
5.4 无限循环(这里就不运行了,你懂的。)
while( true )
do
print("循环将永远执行下去")
end
可用break退出
5.5 循环嵌套
for i=1,4 do
for j=1,i do
print(i)
end
end
或者:
for i=1,4 do
j=1
while j<=i do
print(i)
j+j+1
end
end
6.Lua流程控制
--当条件表达式为false或此处为nil时,为false;其余情况都为true
if(condition为true) then
xxx
end
if(condion为true) then
xxx
else
xxx
end
if(condition为true) then
xxx
elseif() then
xxx
elseif() then
xxx
end
7.Lua函数
local function max(num1,num2)
if(num1>num2) then
return num1
else
return num2
end
end
print(max(1,10))
print("-----------")
temp=max
print(temp(2,5))
myprint=function(param)
print("这是我的打印函数:"..param)
end
myprint(100)
print("-----------")
function add(a,b,printFun)
res=a+b
printFun(res)
end
add(20,30,myprint)
print("-----------")
function tem()
return 1,3,54,65
end
a,b,c,d,e,f=tem()
print(a,b,c,d,e,f)
可变参数
Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 ... 表示函数有可变的参数。
--lua里面的函数可以返回多个值
function test(...)
local arg={...}
res=0
for k,v in pairs(arg) do
res=res+v
end
print(res)
end
test()
test(10)
test(1,2)
test(1,2,3,4,5)
8.Lua运算符
其他的和c#差不多,不同的是:
不等于:~= and / or / not
.. | 连接两个字符串 | a..b ,其中 a 为 "Hello " , b 为 "World", 输出结果为 "Hello World"。 |
# | 一元运算符,返回字符串或表的长度。 | #"Hello" 返回 5 |
运算符优先级
从高到低的顺序:
^
not - (unary)
* /
+ -
..
< > <= >= ~= ==
and
or
9.转义字符:
--字符串定义: “” , ‘’ ,[[]]
--转义字符 :\n 换行 \\代表一个反斜杠 \"代表" \'代表'
a='Hello\nWorld\\hahaha'
print(a)
b=" \' \" "
print(b)
10.Lua字符串
Lua 提供了很多的方法来支持字符串的操作:
序号 | 方法 & 用途 |
---|---|
1 | string.upper(argument): 字符串全部转为大写字母。 |
2 | string.lower(argument): 字符串全部转为小写字母。 |
3 | string.gsub(mainString,findString,replaceString,num) 在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如: > string.gsub("aaaa","a","z",3); zzza 3 |
4 | string.find (str, substr, [init, [end]]) 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。 > string.find("Hello Lua user", "Lua", 1) 7 9 |
5 | string.reverse(arg) 字符串反转 > string.reverse("Lua") auL |
6 | string.format(...) 返回一个类似printf的格式化字符串 > string.format("the value is:%d",4) the value is:4 |
7 | string.char(arg) 和 string.byte(arg[,int]) char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。 > string.char(97,98,99,100) abcd > string.byte("ABCD",4) 68 > string.byte("ABCD") 65 > |
8 | string.len(arg) 计算字符串长度。 string.len("abc") 3 |
9 | string.rep(string, n) 返回字符串string的n个拷贝 > string.rep("abcd",2) abcdabcd |
10 | .. 链接两个字符串 > print("www.runoob".."com") www.runoobcom |
11.数组(在 Lua 中索引值默认是以 1 为起始,但你也可以指定 0或其他值 开始。)
一维数组:
a={}
a[-2]=1
print(a[-2])
b={-1,0,1}
print(b[-1],b[0],b[1])
多维数组:
array = {{},{},{}}
for i=1,3 do
for j=1,3 do
array[i][j] = i*j
print(array[i][j])
end
end
arr={{"张三","李四"},{"王五","赵六"},{"前期","孙吧"}}
print(arr[1][1])
print("---------")
-- 访问数组
for i=1,3 do
for j=1,2 do
print(arr[i][j])
end
end
12.Lua中的迭代器函数-pairs ipairs
pairs迭代table,遍历表中所有的key和value
ipairs按照索引从1开始,递增遍历,遇到nil就停止
arr={"lua","c","java"}
for k,v in pairs(arr) do
print(k,v)
end
print("----------")
arr[2]=nil
for k,v in ipairs(arr) do
print(k,v)
end
自定义Lua迭代函数
for 变量列表 in 迭代函数,状态变量,控制变量 do
循环体
end
1.调用迭代函数,把状态变量和控制变量当做参数传递给迭代函数,状态变量只会在第一次调用的时候赋值
2.如果迭代函数的返回值为nil,退出for循环。如果不是nil的话,把返回值赋值给变量列表,并执行循环体
function square(state,control)
if(state<=control) then
return nil
else
control=control+1
return control,control*control
end
end
for i,j in square,4,0 do
print(i,j)
end
13.Lua table(表)
Table 连接
mytable={"lua","java","c++","c#","c"}
print(table.concat(mytable))
print(table.concat(mytable,",")) --中间用逗号隔开
print(table.concat(mytable,",",2,4)) --只连接索引2到4的数据
Table 插入
mytable={"lua","java","c++","c#","c"}
print(#mytable)
print(mytable[#mytable])
print("-----------")
mytable[#mytable+1]="php"
print(mytable[#mytable])
print("-----------")
table.insert(mytable,"javascript")
print(mytable[#mytable])
print("-----------")
table.insert(mytable,2,"Boo")
print(mytable[1],mytable[2],mytable[3])
Table 删除表内数据
mytable={"lua","java","c++","c#"}
print(mytable[1],mytable[2],mytable[3],mytable[4])
print("-----------")
table.remove(mytable,2)
print(mytable[1],mytable[2],mytable[3],mytable[4])
print("-----------")
mytable[1]=nil
print(mytable[1],mytable[2],mytable[3],mytable[4])
Table 排序- sort()函数
fruits = {"banana","orange","apple","grapes"}
print("排序前:")
for k,v in ipairs(fruits) do
print(k,v)
end
table.sort(fruits)
print("排序后:")
for k,v in ipairs(fruits) do
print(k,v)
end
Table 最大值
mytable={123,64,4,34,76,567,8,23}
function GetMaxNum(tab)
local tem=0
for k,v in pairs(tab) do
if(tem<v) then
tem=v
end
end
return tem
end
print("表中最大值:",GetMaxNum(mytable))
14.Lua 模块(相当于“类”)
--文件名:module.lua
module = {}
module.constant = "这是一个常量" -- 定义一个常量
function module.func1() -- 定义一个函数
io.write("这是一个公有函数!\n")
end
local function func2()
print("这是一个私有函数!")
end
function module.func3()
func2()
end
return module
Lua提供了一个名为require的函数用来加载模块
-- test_module.lua 文件
-- module 模块为上文提到的 module.lua
require("module")
print(module.constant)
module.func3()
或者给加载的模块定义一个别名变量,方便调用:
-- module 模块为上文提到到 module.lua
-- 别名变量 m
local m = require("module")
print(m.constant)
m.func3()