1.对一个数字字符串进行算数操作时,lua会尝试将字符串转换为数字
2.可以用[[]]包住多行字符串
3.字符串间的连接用. .print(a..b)
4.表的默认索引从1开始,表可以当数组使,也可以当字典使,可以随便存啥类型都行,定义方式a = {}
,没初始化的表是nil。
5.函数可以存在变量里
6.可以将任意C/C++的数据类型存到lua变量中调用
7.lua中的变量全是全局变量,表中的和函数中的也都是,要想声明局部变量,就加个local。局部变量的作用域从声明位置开始到语句块结束。
8.赋值语句可以同时赋予多个值,且是先计算右边的值,赋值过去,再挨个往左赋,所以想要交换a,b的值只需要a,b = b,a
9.变量个数与值的个数不一致时以变量个数为准,变量多则补nil,少则忽略多的值。
10.应尽量使用局部变量,访问速度更快,避免命名冲突。
11.循环语句
-- while循环
while(true)
do
doSomething()
end
-- for循环 数值版
for i = 1,10,2 do
doSomething()
end
-- for循环 泛型版
for key,val in pairs(a) do
doSomething()
end
-- repeat until循环
repeat
doSomething()
until(a < 20)
12.goto语句
::somePlace::
goto somePlace
13.Lua中的0
在判断条件中为true
if(a>20)
then
print("a>20")
elseif(a<0)
then
print("a<0")
else
print("a>20&&a<0")
end
14.函数可设置为全局还是局部,默认是全局,局部加local
15.函数返回值可以多个,以,
隔开。
s,e = string.find("lerchain","rch")
print(s,e)
-- 3 5
16.函数可接受可变数目的参数,...
表示有可变数的参数,固定参数必须放到可变参数之前。
17.可以通过select("#",...)
来获取参数的数量
local function ave(666,...)
s = 0
for k, v in ipairs(...)
do
s += v
end
return s/select("#",...)
end
18. 不等于符号~=
,#
返回变量长度,获取表的长度时要小心。
19.string.len(),计算字符串长度。 upper、lower、find、reverse.
20.匹配模式 %a 匹配字母
21.数值下标越界输出nil
22.多维数组
a[] = {}
for i=1 ,3 do
a[i] = {}
for j=1, 3 do
a[i][j] = i+j
end
end
23. 无状态迭代器,效率更高,返回数组中每一个元素,例子ipairs
,实现原理
function iter(i,a)
i = i + 1
if(a[i])
then
return i,a[i]
end
end
function ipairs(a)
return iter, 0 , a
end
24. 表的赋值属于浅拷贝。
25.table.contact(t1,",",1,2)
意为用逗号连接t1表内的前两个元素。
table.insert(t1,5,"lalala")
意为在ti表的第五索引处增加lalala。
table.sort(t1) table.remove(t1,pos)
26.模块基本上就是用表的形式,创建一个文件,在里面这么写
m = {}
m.a = 1;
function m.func1()
doSth()
end
return m
27.使用模块时就用 require (“m”)或者定义个别名 local a = require "m"
28.文件路径以;
分隔,最后加;;
代表新加的路径后面也加上原来的默认路径
29.使用MetaTable可将table关联起来,setmetatable(table,metatable)
是对指定的表设定元表getmetatable(table)
获取对应元表
30.Lua寻找表中元素会先从表里找,如果表里没有就从元表里找,如果元表的__index是个表就再从__index的表里找如此循环,如果__index是个函数就从函数的返回值里找。
31.__index是用于查找的元方法,__newindex是用于更新的元方法,从此新赋的值会更新到__newindedx所对应的表。
32.__calla(b)
,__adda+b
,__tostringprint(a)
等等,擅用这些元方法方为王者。
33.协程:同一时刻只能有一个协程在运行,多个协程间共享大部分内存,只是拥有独立的堆、局部变量,主要是注重彼此的协作。协程的底层实现是线程。
34.使用协程的几个方法
co = coroutine.create(func) //返回coroutine类型
co.resume()//开启协程
co2 = coroutine.wrap(func) //返回函数类型,调用即开启协程
co.yield()//co挂起
co2() //开启协程
print(coroutine.running())//返回正在运行的协程的协程号
print(co2.status)//返回协程当前状态
35. io简单模式: 打开文件file = io.open(filename,+)
加号是可读也可写
io.input(file) --将file作为默认输入文件
io.output(file) --默认输出文件
io.write("aaa")
print(io.read()) --输出文件第一行
read()里可带参数,n 读取一个数字并返回, a 当前位置读取整个文件 number number个字符。
io.close(file) --关闭打开的文件
36.io完全模式:
file = io.open("aa","r")
file:write("...")
file:close() --关闭打开的文件
print(file:read())
36.assert(a == 1,"a~=1")
第一个参数有问题就抛出第二个字符串。
error("em",2)
1是默认,2是返回调用函数的函数