lua中self.__index = self是什么意思?
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,相反,父类并不可以获取子类的值
_call 索引, 它允许你把表当函数调用
local t = setmetatable({}, {
__call = function(t, a, b, c, d)
return (a + b + c) * d
end
})
local res = t(1,2,3,4) --24
lua中self.__index = self是什么意思?的更多相关文章
- Lua语言中的__index,__newindex,rawget和rawset
转自:http://blog.csdn.net/wangbin_jxust/article/details/12108189 在谈及Lua中的__index,__newindex,rawget和raw ...
- Lua中强大的元方法__index详解
今天要来介绍比较好玩的内容:__index元方法 我是备胎,记得回头看看 咳咳,相信每一位女生都拥有或者不知不觉中拥有了一些备胎,啊!当然,又或许是成为过别人的备胎. 没有备胎的人,就不是完整的人生. ...
- Lua中metatable和__index的联系
Lua中metatable和__index的联系 可以参考 http://blog.csdn.net/xenyinzen/article/details/3536708 来源 http://blog. ...
- Lua中__index和__newindex实践
[具有默认值的table] 我们都知道,table中的任何字段的默认值都是nil,但是通过元表,我们可以很容易的修改这一规定,代码如下: function setDefault(tb, default ...
- lua中基类和“继承机制”
基类:基类定义了所有对于派生类来说普通的属性和方法,派生类从基类继承所需的属性和方法,且在派生类中增加新的属性和方法. 继承:继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类. lu ...
- 在 lua 中实现函数的重载
在 lua 中实现函数的重载.注:好吧,lua中原来可以实现重载...local function create() local arg_table = {} local function dispa ...
- lua 中的面向对象
lua 是一种脚步语言,语言本身并不具备面向对象的特性. 但是我们依然可以利用语言的特性,模拟出面向对象的特性. 面向对象的特性通常会具备:封装,继承,多态的特性,如何在lua中实现这些特性,最主要的 ...
- lua中常量的实现及表的深拷贝实现
废话:好久没在这里写博客了...主要原因是我买了个域名hanxi.info并在github上搭建了个人博客... lua中默认是没有c中的const常量的,在csdn上找到了一个使用setmetata ...
- Lua中的weak表——weak table
弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak ref ...
随机推荐
- Linux认知之旅【04 进一步了解目录】!
一.目录是什么? 二.不得不提的文件系统! 三.绝对路经,相对路径
- iPhone新建项目不能全屏
上个周做项目的时候,发现新建了一个项目不能全屏.伤透了我的脑筋,然后又请教了团队里其他两个大牛帮我搞定了这个问题. 虽然是搞定了,但也看的出大牛也是云里雾里.歪打正着解决的. 今天又想新做个项目,这个 ...
- WeUI 在小程序中使用
才接触小程序.想找个ui框架..也不知道咋弄: 下载地址:点击打开链接 将weui-wxss-master\dist\style\weui.wxss文件导入到小程序项目的根目录下 引入weui.wxs ...
- windows 10 change default program bug
windows 10 change default program bug https://www.isumsoft.com/windows-10/how-to-change-or-set-defau ...
- 【bzoj1270】[BeijingWc2008]雷涛的小猫 dp
题目描述 输入 输出 样例输入 样例输出 8 题解 dp 设f[i][j]表示在第i棵树的j高度时最多吃到的柿子数. 那么只有两种可能能够到达这个位置:滑下来.跳下来. 滑下来直接用f[i][j+ ...
- Password [分块]
题面 $n,m,x \leq 10^5$ 思路 首先$n=2$做法很多,不讲了 $n=3$的时候,分块维护两个东西:每一个数出现次数的前缀和,和出现次数的出现次数的前缀和(说的有点绕,但是应该挺好理解 ...
- Tensorflow 载入数据的三种方式
Tensorflow 数据读取有三种方式: Preloaded data: 预加载数据 Feeding: Python产生数据,再把数据喂给后端. Reading from file: 从文件中直接读 ...
- HDU 1087 最大上升子序列的和
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- Java并发(2)- 聊聊happens-before
引言 上一篇文章聊到了Java内存模型,在其中我们说JMM是建立在happens-before(先行发生)原则之上的. 为什么这么说呢?因为在Java程序的执行过程中,编译器和处理器对我们所写的代码进 ...
- OpenCV 2.4.9 学习笔记(3)—— OpenCV自动为输出数组(矩阵)分配内存
OpenCV大部分时候会为OpenCV方法中的输出数据(方法的参数)自动分配内存,所以如果一个方法的参数有一个或者多个输入数组(cv::Mat 实例)和一些输出数组时,OpenCV会自动为输出数组分配 ...