Lua语法总结
+++++++++++++一、Lua的变量类型:1.简单变量 nil(空);number(数字(整数的小数));boolean(布尔);string(字符串)
2.复杂变量 function:函数、table:表、userdata:数据结构、thread:协同程序
二、Lua中的type函数返回一个字符串type(a),返回a的类型,Lua中不用指明变量类型,也可以直接使用未赋值的变量(默认为nil)
三、Lua的字符串操作 1.长度获取#
2.多行打印 (1)转义字符 print("123\n123")
(2)[[]] s = [[我是
唐
老师
]]
print(s)
3.字符串的拼接 (1) ..
(2) string.format
4.其他类型转字符串 tostring
5.字符串提供的其他api 1.小写转大写string.upper()
2.大写转小写string.lower()
3.翻转字符串string.reverse()
4.字符串索引查找string.find(srt,"Cde")
5.截取字符串string.sub(str,3,4)
6.字符串重复string.rep(str,2)
7.字符串修改string.gsub(str,"xx","yy")
8.字符串转ASCII string.byte()
9.ASCII转字符串string.char()
四、Lua的运算符 1.算术运算符 + - % ^ / = 等
2.逻辑运算符: and or not
3.不支持位运算和三目运算,没有自增自减和符合运算符
五、Lua的条件分支语句 if(条件) then ……end
1.单分支 if a > 5 then print("123") end
2.双分支 if a < 5 then print("123") else print("321") end
3.多分支if 条件 then.....elseif 条件 then....elseif 条件 then....else.....end
4.Lua中也没有Switch 也需要自己实现
六、Lua中的循环 1.While while 条件 do ..... end
2.repeat ..... until 条件 (注意:条件是结束条件) repeat print(num)num = num + 1 until num > 5 --满足条件跳出 结束条件
3.for循环 for 变量名=起始值,结束值,增值 do……end for i =1,5,2 do --如果要自定义增量 直接逗号后面写 不写默认为1 也 可以为-1这种
七、Lua的函数 function 1.两种声明方式 --function 函数名() ……end 和a = function()……end
2.有参函数的参数列表个数传多了或者少了都不会报错 多了会丢弃,少了会补空
3.函数的返回值:多返回值时,外部用多个变量来接取,接多接少不影响,少丢弃,多报空
例:function F4(a) return a, "123", true end
temp, temp2, temp3, temp4 = F4("1")
4.函数类型 就是 function
5.函数名相同 参数类型不同 或者参数个数不同 lua中 函数不支持重载 默认调用最后一个声明的函数
6.变长参数 变长参数使用 用一个表存起来 再用 function F7( ... ) arg = {...} for i=1,#arg do print(arg[i]) end end
F7(1,"123",true,4,5,6)
7.闭包:改变变量的声明周期 !!
八、复杂数据类型:表是一切复杂数据的基础:数组 二维数组 字典 类等等 lua中 索引从1开始 #是通用的获取长度的关键字 在打印长度的时候
空被忽略 如果表中(数组中)某一位变成nil 会影响#获取的长度
九、迭代器遍历: IPairs和Pairs
--ipairs ipairs遍历 还是 从1开始往后遍历的 小于等于0的值得不到 只能找到连续索引的 键 如果中间断序了 它也无法遍历出 后面的内容
--Pairs 它能够把所有的键都找到 通过键可以得到值
十、复杂数据类型:表
1.字典 --字典是由键值对构成 访问某个变量的方法: print(a["name"]) 和 print(a.name)
修改a["name"] = "TLS"; 如果没有name这个键,就会直接新增
删除 a["sex"] = nil
模拟字典遍历要用pairs
2.类: parent={}
Parent.__index=Parent
fuction Parent:New()
local self={}
setmetatable(self,{__index=Parent})
return self
end
继承:Son=Parent.New()
多态:相同方法 不同执行逻辑 就是多态
base 指的是 GameObject 表(类)
--这种方式调用 相当于是把基类表 作为第一个参数传入了方法中
--避免把基类表 传入到方法中 这样相当于就是公用一张表的属性了
--我们如果要执行父类逻辑 我们不要直接使用冒号调用
--要通过.调用 然后自己传入第一个参数
self.base.Move(self)
3.表中的成长函数和学习函数
学习函数 能够在函数内部调用自己属性或者方法的方法 把自己作为一个参数传进来在内部访问
4.Lua中用冒号调用函数 会把调用者作为第一个参数传递进去
5.Lua的一些表的方法 remove 传表进去会移除最后一个索引的内容
传两个参数 第一个参数 是要移除内容的表 第二个参数 是要移除内容的索引
sort:传入要排序的表 默认降序排列 传入两个参数 第一个是用于排序的表 第二个是 排序规则函数
concat:连接函数 用于拼接表中元素 返回值 是一个字符串
6.其他脚本的执行 package.loaded["脚本名"] 返回值是boolean 意思是 该脚本是否被执行
卸载已经执行过的脚本 package.loaded["Test"] = nil
_G表是一个总表(table) 他将我们申明的所有全局的变量都存储在其中
7.特殊用法: --多变量赋值 如果后面的值不够 会自动补空 a,b,c = 1,2
--多变量赋值 如果后面的值多了 会自动省略 a,b,c = 1,2,3,4,5,6
--多返回值时 你用几个变量接 就有几个值 如果少了 就少接几个 如果多了 就自动补空
--逻辑与 逻辑或
-- and or 他们不仅可以连接 boolean 任何东西都可以用来连接
-- 在lua中 只有 nil 和 false 才认为是假
-- "短路"——对于and来说 有假则假 对于or来说 有真则真 所以 他们只需要判断 第一个 是否满足 就会停止 计算了
8.协程:协程的本质还是一个线程
--常用方式 1.coroutine.create() co = coroutine.create(fun) print(co) 启动 coroutine.resume(co) 返回thread
2.co2 = coroutine.wrap(fun) 返回一个函数 启动co2()
协程挂起:coroutine.yield()
coroutine.status(协程对象或者协程函数) dead 结束 suspended 暂停 running 进行中
coroutine.running() 返回一个线程编号
9.元表 :任何表变量都可以作为另一个表变量的元表 任何表变量都可以有自己的元表
设置元表 setmetatable(son, father)
得到元表 getmetatable(son)
__tostring 当子表要被当做字符串使用时 会默认调用这个元表中的tostring方法
__call 当子表被当做一个函数来使用时 会默认调用这个__call中的内容且默认第一个参数是自己
__index 当子表中 找不到某一个属性时会到元表中 __index指定的表去找属性
--newIndex 当赋值时,如果赋值一个不存在的索引 那么会把这个值赋值到newindex所指的表中 不会修改自己
10 . os.time() os.time({year = 2014, month = 8, day = 14}
math的用法 : print(math.abs(-11)) 绝对值
math.deg(math.pi) 弧度转角度
math.cos(math.pi) 三角函数传弧度
math.floor(2.6) math.ceil(5.2) 向下向上取整
math.max(1,2) math.min(4,5) 最大最小值
math.modf(1.2) 小数分离 分成整数部分和小数部分
随机数先设置随机数种子 math.randomseed(os.time()) math.random(100) math.random(100)
11.Lua的垃圾回收 collectgarbage("count")
