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 ...
随机推荐
- (原)DirectX11 深度测试(有点另类)
(问到自己清楚就可) @Author: 白袍小道 @说明:转载随缘,评论随缘,询问建议看书和源码会得到更准确的答案 深度测试的来源.目的.做法 一.问题询问 我们带着一些问题去浏览一番 1.深度测试发 ...
- CSU-1989 赶路的小X
题目链接 http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=1989 题目 Description A国一共有N座城市,由M条双向公路连 ...
- lo口环路问题分析
流程如下,collecter抓取网卡lo和wlan0数据,其中lo口无数据,wlan0是笔记本上网网口,然后按自定义协议把数据包通过lo口发给后端dispatch进行分发! 这种模式下,抓包程序每经过 ...
- JavaScript里面的正则以及eval
1.eval JavaScript中的eval是Python中eval和exec的合集,既可以编译代码也可以获取返回值. eval() EvalError 执行字符串中的JavaScript代码 ...
- poj 3080 kmp求解多个字符串的最长公共字串,(数据小,有点小暴力 16ms)
Blue Jeans Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14113 Accepted: 6260 Descr ...
- v-if与v-show区别
在v-show中,元素是一直存在的,当v-show为false时,元素display:none只是隐藏了而已. v-if 作用:判断是否加载固定的内容,如果为真,则加载:为假时,则不加载. 用处:用在 ...
- perf 的事件
perf的事件包括: 硬件事件:branch-instrctions / branch-miss / bus-cycles / cache-miss / cache-reference / cycle ...
- Android React Native组件的生命周期及回调函数
熟悉android的童鞋应该都清楚,android是有生命周期的,其很多组件也是有生命周期.今天小编和大家分享的React Native组件的生命周期,还不了解的童鞋,赶紧来围观吧 在android开 ...
- Recompile Squid with SSL Bump
https://docs.diladele.com/administrator_guide_4_0/system_configuration/https_filtering/recompile_squ ...
- 用基于类的通用视图处理表单(Class-based generic views)
处理表单通常包含3步: 初始化GET(空白的后者预填充的表单) POST非法数据(通常重新显示带有错误信息的表单) POST合法数据(提交数据并重定向) 为了将你从这些烦人的重复步骤中解救出来,Dja ...