您的位置:首页 > 编程语言 > Lua

lua中self.__index = self是什么意思?

2017-03-16 20:23 459 查看

example1

Account = {balance = 0}
function Account:new(conf)
conf = conf or {}
setmetatable(conf,self)
self.__index = self
return conf
end


Account
模拟一个对象,
new
方法类似于实例化一个对象,
conf
可存放一些初始值作用等同于
conf
Account
的子类。

解释:
Account
这个table有一个属性
balance
,通过
new
函数实例化一个类继承于
Account
。在lua中类,父类都是通过table数据结构加上元表元方法来实现。

__index
是lua一个元方法,被广泛的使用在模拟实现继承方法。访问一个table中不存在的key,lua将会返回一个nil。

但一个表存在元表的时可能会发生改变。既访问不存在的key时,如果这个table存在元表,就会尝试在它的元表中寻找是否存在匹配key对应的value。

:
是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中写法:

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


example2

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,相反,父类并不可以获取子类的值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: