总结一下Lua编程中常用到的知识点
知识点
-
“#”用于求长度,例如#+字符串/表
-
表的声明方式: 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()获取线程状态
-
执行完的协同函数不能复活,必须重新创建
面向对象
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
8. 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。