__index元方法
Lua 查找一个表元素时的规则,其实就是如下 3 个步骤:
1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
3.判断元表有没有 index 方法,如果 index 方法为 nil,则返回 nil;如果 index 方法是一个表,则重复 1、2、3;如果 index 方法是一个函数,则返回该函数的返回值。
注:查找一个子表不存在的元素,不会在元表中查找,而是在元表的__index元方法中找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 son = { name = "son name" , } parent = { age = 101 , __index = { name = "parent name" , age = 23 , } } parentIndexTbl = { sex = "female" , __index ={ sex = "man" } } setmetatable (son, parent)print (son.name) print (son.age) setmetatable (parent.__index , parentIndexTbl)print (son.sex)
__newindex 元方法
在修改子表的属性时,若子表里不存在,就在元表的 __newindex
表里添加该属性。如果元表的 __newindex
是一个函数则执行
1 2 3 4 5 6 7 8 9 10 mymetatable = {} mytable = setmetatable ({key1 = "value1" }, { __newindex = mymetatable }) print (mytable.key1) mytable.newkey = "新值2" print (mytable.newkey,mymetatable.newkey) mytable.key1 = "新值1" print (mytable.key1,mymetatable.key1)
注:修改一个子表不存在的元素,不会在元表中查找,而是在元表的__nexindex元方法中修改
lua面向对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Shape = {area = 0 } function Shape:new (o,side) o = o or {} setmetatable (o, self ) self .__index = self side = side or 0 self .area = side*side; return o end function Shape:printArea () print ("面积为 " ,self .area) end myshape = Shape:new(nil ,10 ) myshape:printArea()
setmetatable(o, self) self.__index = self
这两步将基表设置为元表并将基表的__index表设为自己,这样子表不存在的元素都会从这个基表查询,这样基表定义了的函数和属性都可以被查询访问到,就好像是自己继承过来一样,虽然自己没有声明过但是可以访问,而重写只需要在自己内部声明跟基表同名的变量和函数就可以了
协同程序
协程的本质是一个线程对象
1)创建
1 2 3 4 5 6 fun = function () print (123 ) end co = coroutine .create (fun) co2 = coroutine .wrap (fun)
2)运行
1 2 coroutine .resume (co) co2()
3)挂起
1 2 3 4 5 6 7 8 9 10 11 fun2 = function () local i=1 while true do print (i) i=i+1 coroutine .yield (i) end end co3 = coroutine .create (fun2) isOk, tempI = coroutine .resume (co3) isOk, tempI = coroutine .resume (co3)
4)状态
dead 结束(协程函数执行完毕)
suspended 暂停 (调用了coroutine.yield())
running 运行中(协程函数内部可以获取)
1 2 coroutine .status (co)coroutine .running ()
自带库
1)string
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 string .len (arg ) string .upper (str) string .lower (str) string .reverse (arg ) string .char (arg ) string .byte (arg [,int]) string .sub (str, i [, j])string .gsub (mainStr, findStr, replaceStr, num)string .find (str, subStr, [init, [end ]])string .rep (string , n) string .format (...)
2)table
1 2 3 4 5 6 7 8 9 #tab table .concat (tab, sep, start, end )table .insert (tab, pos, value)table .remove (tab, pos)table .sort (tab, comp)
3)时间
1 2 3 4 5 6 os .time () os .time ({year = 2014 , month = 8 , day = 14 }) os .date ("*t" )
4)math
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 math .abs (-11 )math .deg (math .pi ) math .cos (math .pi ) sqrt 、pow exp 、log 、log10 ldexp sin 、cos 、tan 、acos 、asin 、atan ceil 、floor min 、max cosh 、sinh 、tanh deg 、rad random randomseed abs modf pi
5)路径
垃圾回收
1 2 3 4 5 collectgarbage ("count" )collectgarbage ("collect" )
toLearn
https://blog.csdn.net/zzulp/article/details/22797233