for key, var inpairs(arr) do print(key, var) -- 数组的索引从1开始 end
通过api操作
1 2 3 4 5 6 7 8
arr = {} for var=1, 100do table.insert(arr, 1, var) -- table.insert(table, pos, value) -- 在table的pos位置插入value -- 所以上面的插入索引和value顺序相反 -- 除非table.insert(arr, var, var),则索引==value end
数组长度table.maxn(arr),注意lua数组索引从1开始
面向对象
lua本身没有面向对象,但是可以通过某种方式实现
使用表的形式(类似golang)
1 2 3 4 5 6 7 8
Obj = {} functionObj.sayHi() print("hi") end -- 或者 Obj.sayHi = function() print("hi") end
创建实例,由于lua的类实质就是一个表,所以遍历表,复制,返回即可
1 2 3 4 5 6 7 8 9
functionclone(tab) local ins = {} for key, var inpairs(tab) do ins[key] = var end return ins end -- 然后这里创造了一个类Obj,balabala local p = clone(Obj)
构造方法,书接上文
1 2 3 4 5 6 7
Obj.new = function(arg) local self = clone(Obj) self.name = arg
return self end local p = Obj.new("ring")
关于指向自己的指针
1 2 3 4 5 6 7
Obj.hello = function(self) print("hello "..self.name) -- ..表示连接字符串 end local p = Obj.new("ring") p.hello(p) p:hello() -- 默认传入自己作为第一个参数 -- 两个方法等效,一般使用下面这个方法
继承
1 2 3 4 5 6 7 8 9 10 11
functioncopy(dist, tab) for key, var in paires(tab) do dist[key] = var end end Son = {} Son.new = function(arg) local self = Obj.new(arg) copy(self, Son) -- 也别忘了自己原有的东西 return self end
使用函数闭包的形式面向对象,可以实现私有化,但是表的方式更块些
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
fuction Obj(arg) local self = {} localfunctioninit()-- 私有 self.name = arg end
self.sayHi = function() print("hi") end
init() -- 标准化 return self end local p = Obj("ring") p:sayHi()
继承
1 2 3 4 5
functionSon(arg) local self = Obj(arg) -- some return self end
使用元表
语法糖obj:funciotn(),默认会传入self
注意 使用:默认会传入self作为第一个参数,所以使用时要注意谁才是真正的参数
模板
1 2 3 4 5 6
functionA:New() local o = {} setmetatable(o, self) // self作为o的元表,仅仅建立起关联,这时self中的任何值都不会影响到o self.__index = self // 当元表中存在__index时,如果key索引不到,会从__index找,因此这步开始才让o和self有影响。这样就实现了o继承self,即A return o end