Account = {balance = 0} function Account:new(conf) conf = conf or {} setmetatable(conf,self) self.__index = self return conf end
Account
模拟一个对象,new
方法相似于实例化一个对象,conf
可存放一些初始值做用等同于conf
是Account
的子类。mysql
解释:Account
这个table有一个属性balance
,经过new
函数实例化一个类继承于Account
。在lua中类,父类都是经过table数据结构加上元表元方法来实现。
__index
是lua一个元方法,被普遍的使用在模拟实现继承方法。访问一个table中不存在的key,lua将会返回一个nil。
但一个表存在元表的时可能会发生改变。既访问不存在的key时,若是这个table存在元表,就会尝试在它的元表中寻找是否存在匹配key对应的value。sql
:
是lua面向对象的语法糖。Account:new(conf)
等同于Account.new(self, conf)
,至关于将调用者自身当作第一个参数,使用冒号调用就至关于隐式地传递self
参数。数据结构
元方法的定义能够写在new函数外面。以下:函数
Account = {balance = 222} Account.__index = Account function Account:new(conf) conf = conf or {} setmetatable(conf, self) return conf end
或者相似于lua_resty_mysql中写法:lua
Account = {balance = 222} local mt = {__index = Account} function Account:new(conf) conf = conf or {} setmetatable(conf, mt) return conf end
- 调用:
local aa = Account:new() ngx.say(aa.balance) --222
local a = {} local b = {k = 11} setmetatable(a,b) --设置元表,仅仅设置元表并不能使lua寻找父类的方法或属性 b.__index = b --设置元方法 b.v = 22 --给b表增长一个属性 a.aa = 33 --给a表增长一个属性 print(a.k) --11, 返回父类b中k的值。 print(a.v) --22,父类增长的属性和方法均可以被子类继承 print(b.aa) --nil,相反,父类并不能够获取子类的值
local t = setmetatable({}, { __call = function(t, a, b, c, d) return (a + b + c) * d end }) local res = t(1,2,3,4) --24