知识点
“#”用于求长度,例如#+字符串/表
表的声明方式: table = {[“a”] = “Lua”,[“b”] = “C#”,[“c”] = “C++”}
或者 table = { a = “Lua” , b = “C#” , c = “C++” }
如果是数字key则中括号不能省略table的默认索引是从 1 开始
可以用 2 对方括号 “[[]]” 来表示”一块”字符串。(类似C# 中的@)
if后必跟一个then语句
Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(…) 表示函数有可变的参数。
可变参数中 arg 参数的最后一个数为参数的个数 ,使用 local arg = {…}来取得参数
- pairs 和 ipairs异同
同:都是能遍历集合(表、数组)
异:ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key。
pairs 能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。
协程
-
- 定义协程函数,将方法放在 coroutine.create()中
使用 coroutine.resume()启动或者继续协程 - 定义协同函数,将函数放在 co = coroutine.wrap()中的
使用 co(arg1,arg2)启动 - 暂停协同函数使用 coroutine.yield(),在yield中的参数可以传递出来
- 使用 coroutine.status()获取线程状态
- 定义协程函数,将方法放在 coroutine.create()中
执行完的协同函数不能复活,必须重新创建
面向对象
1.定义类
Person = {name ="",age = 18}
function Person:eat()
print(self.name)
end
--当使用 : 来定义函数的时候可以使用 self 来获取当前调用者,并且调用必须使用 : 才能使用
a = Person
a:eat()
a.eat(a)
2.构造函数
function Person:new()
local t = {}
setmetatable(t,{__index = self} --当索引不存在会查找元表中的索引
return t
end
3.继承实现
Student = Person:new()
Student.grade = 1
--Student相当于Person的子类
stu1 = Student:new()
元表metatable
metatable
使用__metatable可以保护元表,禁止用户访问元表中的尘成员或者修改元表__index
当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。
__newindex
__newindex 元方法用来对表更新,当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。__add
__add 键包含在元表中,并进行相加操作。__call
__call 元方法在 Lua 调用一个值时调用.
__call = function(mytable,arg) –arg位参数 10
mytable(10)__tostring
__tostring 元方法用于修改表的输出行为。print(mytable)rawget 和 rawset
如果不想在访问一个table时涉及到它的__index方法,可以使用函数rawget。调用rawget(t,i)
就是对table t进行了一个“原始(raw)”的访问,也就是一次不考虑元表的简单访问。一次原始访问并不会加速代码的执行。
调用rawset(t,k,v)就可以不涉及任何元方法而直接设置table t中与key k向关联的value l。