当前位置: 首页 > news >正文

国家企业信用信息没有网站怎么做做网站的外包公司

国家企业信用信息没有网站怎么做,做网站的外包公司,模板网站 优帮云,外国人爱做视频网站吗接上文 文章目录 元表__tostring__call__index__newindex运算符元方法其它元表操作 元表 Q:为什么要使用元表? A:在Lua中,常常会需要表与表之间的操作。元表中提供了一些元方法,通过自定义元方法可以实现想要的功能&…

在这里插入图片描述
接上文

文章目录

  • 元表
    • `__tostring`
    • `__call`
    • `__index`
    • `__newindex`
    • 运算符元方法
    • 其它元表操作


元表

Q:为什么要使用元表?

A:在Lua中,常常会需要表与表之间的操作。元表中提供了一些元方法,通过自定义元方法可以实现想要的功能,相当于面向对象中给你一系列方法让你重载。

使用下列代码设置元表:

meta={}
table={}
setmetatable(table,meta) -- 第一个元素为子表,第二个元素为元表

通常在元表中操作分为三步:

  1. 操作子表
  2. 检测是否有元表
  3. 若有元表,检测有无对应元方法,没有元方法则返回对应操作本来的处理。若有对应元方法执行元方法。

元方法索引一般以"__"(两个下划线,我想这是因为命名私有静态变量常常以一个下划线作为开头)作为开头,例如下面的例子:

__tostring

meta = {}
table={}
setmetatable(table, meta)
print(table)
输出:
table: 00ABA2A8
meta = {__tostring = function ()  <--注意两个下划线return "123"end
}
table={}
setmetatable(table, meta)
print(table)输出:
123

上例相当于使用元方法重载print函数

meta = {__tostring = function (t)return t.nameend
}
table={name = "233"}
setmetatable(table, meta)
print(table)输出:
233

在上例中,即使我们未指定元方法的入参,但是因为子表和元表的关联,元方法会自动地将子表作为参数传入元方法。


__call

让我们再定义一个__call元方法

meta = {__tostring = function ()return "456"end,__call = function(a)print(a.name)print(a)print("call")end
}
table={name = "123"}
setmetatable(table, meta)
table(2)  --无论table(x)中给出的x为几,结果都是一样的输出:
123
456
call

定义了__call元方法后,我们使用table(index),发现__call元方法打印了123,456和call,123是子表的元素,而456是__tostring的返回结果。这意味着__call方法调用了子表作为入参a。并且像我们上面的打印样例一样,print(a)方法又同时会调用__tostring的元方法。而table(2)中的参数2很明显被无视了。

现在我们可以确定一个基本规则:当使用__tostring__call元方法时,我们定义的第一个参数一定是子表table本身,只有定义更多参数才能接收其它入参:

meta = {__tostring = function ()return "456"end,__call = function(a,b)print(a)print(b)print("call")end
}
table={name = "123"}
setmetatable(table, meta)
table(2)输出:
456
2
call

__index

meta = {
}
table1 = { age = 1 }
setmetatable(table1, meta)
print(table1.name)输出:
nil

我们想要找到表中的name索引,当然是没有的,输出结果是nil
那能不能让元表拥有这个索引呢?答案是不行,因为找的还是table1:

meta = {name =1}
table1 = { age = 1 }
setmetatable(table1, meta)
print(table1.name)输出:
nil

现在我们定义一个元方法 __index,它会指向一个其他的查询表

meta = { name = 2 }
meta.__index = meta
table1 = { age = 1 }
setmetatable(table1, meta)
print(table1.name)输出:
2

整个查找的流程其实是:

  1. 查询子表
  2. 子表查询失败,查询元表有无 __index元方法
  3. 若有,则查询 __index元方法指向的表

但是还有种情况,建议不要把__index元方法在元表内部定义:

meta = {name = 2,__index = meta,
}
table1 = { age = 1 }
setmetatable(table1, meta)
print(table1.name)输出:
nil   --不明觉厉

还可以套娃

meta = {
}
metaFather = {name =4,
}
table1 ={age =1}
meta.__index = meta  --让元表的index指向meta,子表找不到就去meta里找
metaFather.__index =metaFather --让元表的index指向metaFather,子表找不到就去metaFather里找
setmetatable(meta,metaFather)
setmetatable(table1, meta)
print(table1.name)输出:i
4  --允许套娃

__newindex

看4个例子:

meta = {}
table1 ={}
table1.age = 1
setmetatable(table1, meta)
print(table1.age)输出:
1meta = {}
table1 ={age = 1}
meta.__newindex = {}
setmetatable(table1, meta)
print(table1.age)输出:
1meta = {}
table1 ={}
meta.__newindex = {}
setmetatable(table1, meta)
table1.age = 1
print(table1.age)输出:
nilmeta = {}
table1 ={}
meta.__newindex = {}
table1.age = 1
setmetatable(table1, meta)
print(table1.age)输出:
1

有没有很诡异?其实很好理解,这是由于__newindex元方法,它的作用其实是将子表新加入的元素加入到__newindex所指向的表而不修改子表(当然__newindex也可以套娃):

meta = {}
table1 ={}
meta.__newindex = {}
setmetatable(table1, meta)
table1.age =1
print(table1.age)
print(meta.__newindex.age)输出:
nil
1

运算符元方法

meta = {__sub = function (t1,t2)return t1.age - t2.ageend
}
table1={age=1}
table2={age=2}
setmetatable(table1, meta)  --无论把元表设置给table1还是table2,结果都一样
print(table1 - table2)输出:
-1

我们发现使用运算符元方法的时候,第一个参数也不默认是绑定的子表了。而是根据运算符的左右变量依次给元方法赋值。而且无论元表设置给减数还是被减数,最终结果都是不变的。运算符元方法较多,这里就不详细列举了,从菜鸟教程上直接抄了个表格:

元方法描述
__add对应的运算符 ‘+’
__sub对应的运算符 ‘-’
__mul对应的运算符 ‘*’
__div对应的运算符 ‘/’
__mod对应的运算符 ‘%’
__unm对应的运算符 ‘-’
__concat对应的运算符 ‘..’
__pow对应的运算符 ‘^’
__eq对应的运算符 ‘==’
__lt对应的运算符 ‘<’
__le对应的运算符 ‘<=’

在这之中除了正常的数学运算,我们还需要讲一下比较特殊的逻辑判断的元方法(就是上表中加粗的几列),这几个元方法需要运算符的双方都绑定同一个元表。原因是元方法没有提供大于符号,运算a>b的元方法其实相当于运算b<a的原方法,这就需要b也绑定元表,因此逻辑运算硬性要求运算双方都绑定同一个元表,让我们看看下列的例子:

meta = {__eq= function (t1,t2)return trueend,
}
table1 = { age = 1 }
table2 = { name = nil }
setmetatable(table1, meta)
print(table1 == table2)
setmetatable(table2, meta)
print(table1 == table2)输出:
false
true

我们可以发现上述的相等的逻辑判断是有问题的,第一个print出false,第二个print出true。

在第一个print的时候,只有table1绑定了元表,而table2没有,之所以return false是因为在逻辑运算的时候需要左右双方都绑定同一个元表。

而在第二个print的时候打印了true,即使table1table2内容不同。因为这是我们自定义的元方法,我们默认返回的就是true

几道例题,请思考下列几个例子的输出结果:

meta = {__eq= function (t1,t2)if t1.age == t2.age thenreturn trueendend,
}
table1 = { age = 1 }
table2 = { age = 2 }
setmetatable(table1, meta)
setmetatable(table2, meta)
print(table1 == table2)输出:
false

上述例子中,我们用__eq元方法来判断age索引值是否相同,显然是不同的,因此是false

meta = {__eq= function (t1,t2)if t1.name == t2.name thenreturn trueendend,
}
table1 = { age = 1 }
table2 = { name = nil }
setmetatable(table1, meta)
setmetatable(table2, meta)
print(table1 == table2)输出:
true

上述例子中,我们用元方法判断name索引值是否相同,而table1没有name索引,默认为nil,table2有name = nil,因此是true

meta = {__eq= function (t1,t2)if t1 == t2 thenreturn trueendend,
}
table1 = { age = 1 }
table2 = { name = nil }
setmetatable(table1, meta)
setmetatable(table2, meta)
print(table1 == table2)输出:
栈溢出

上述例子中,我们在元方法内部判断t1==t2,而进行判断时相当于再次调用了__eq元方法,因此会无限循环最终导致栈溢出。


其它元表操作

print(getmetatable(table1)) --使用getmetatable方法获得table1的元表地址输出:
table: 00BBA320
meta = { name = 2 }
meta.__index = meta
table1 = { age = 1 }
setmetatable(table1, meta)
print(rawget(table1,"nane"))  --rawget方法只查询子表,无视元表index输出:
nil
meta = {}
table1 ={}
meta.__newindex = {}
setmetatable(table1, meta)
table1.age =1
print(table1.age)
rawset(table1, "age", 1) --rawset方法可以无视元表的newindex,直接修改子表
print(table1.age)输出:
nil
1

文章转载自:
http://pursuant.c7630.cn
http://podsol.c7630.cn
http://earlobe.c7630.cn
http://dracon.c7630.cn
http://scabrous.c7630.cn
http://contiguous.c7630.cn
http://monogrammed.c7630.cn
http://unshaved.c7630.cn
http://christmasy.c7630.cn
http://autoecism.c7630.cn
http://dumfriesshire.c7630.cn
http://asbestos.c7630.cn
http://rusticize.c7630.cn
http://allophone.c7630.cn
http://rightlessness.c7630.cn
http://firmly.c7630.cn
http://wisteria.c7630.cn
http://orthopsychiatry.c7630.cn
http://proem.c7630.cn
http://croquet.c7630.cn
http://prise.c7630.cn
http://chela.c7630.cn
http://woke.c7630.cn
http://subregion.c7630.cn
http://bicolor.c7630.cn
http://hold.c7630.cn
http://hematophyte.c7630.cn
http://coracle.c7630.cn
http://parvitude.c7630.cn
http://nananne.c7630.cn
http://sourness.c7630.cn
http://reductant.c7630.cn
http://progenitrix.c7630.cn
http://canadian.c7630.cn
http://winded.c7630.cn
http://railsplitter.c7630.cn
http://floccus.c7630.cn
http://lobbyism.c7630.cn
http://configurated.c7630.cn
http://fusiform.c7630.cn
http://misanthropist.c7630.cn
http://placentology.c7630.cn
http://asia.c7630.cn
http://whitesmith.c7630.cn
http://astoundment.c7630.cn
http://cacholong.c7630.cn
http://jovian.c7630.cn
http://huanghai.c7630.cn
http://iconoclasm.c7630.cn
http://today.c7630.cn
http://ossetia.c7630.cn
http://alabandite.c7630.cn
http://mester.c7630.cn
http://laundrywoman.c7630.cn
http://pollee.c7630.cn
http://corsetry.c7630.cn
http://xuthus.c7630.cn
http://eponymy.c7630.cn
http://sonable.c7630.cn
http://dishabituate.c7630.cn
http://soweto.c7630.cn
http://distrustful.c7630.cn
http://arrange.c7630.cn
http://orangery.c7630.cn
http://heriot.c7630.cn
http://planform.c7630.cn
http://miogeoclinal.c7630.cn
http://handpress.c7630.cn
http://zygophyllum.c7630.cn
http://undecipherable.c7630.cn
http://yacare.c7630.cn
http://bolivar.c7630.cn
http://apulian.c7630.cn
http://gimme.c7630.cn
http://armorica.c7630.cn
http://gourdshaped.c7630.cn
http://nene.c7630.cn
http://frondescent.c7630.cn
http://embodier.c7630.cn
http://superfluid.c7630.cn
http://preponderant.c7630.cn
http://columbous.c7630.cn
http://horra.c7630.cn
http://ossianic.c7630.cn
http://comprehensible.c7630.cn
http://shuttlecock.c7630.cn
http://ferlie.c7630.cn
http://dab.c7630.cn
http://dharmsala.c7630.cn
http://postboy.c7630.cn
http://zymoid.c7630.cn
http://undeniable.c7630.cn
http://unrhythmic.c7630.cn
http://revet.c7630.cn
http://sortita.c7630.cn
http://repentant.c7630.cn
http://toad.c7630.cn
http://appropriable.c7630.cn
http://defibrillator.c7630.cn
http://microseism.c7630.cn
http://www.zhongyajixie.com/news/89700.html

相关文章:

  • 内部卷网站怎么做的宁波seo关键词费用
  • 蜜雪加盟一般多少钱seo教育
  • 轻量的wordpressseo蜘蛛池
  • 网站建设正规公司百度做网站推广的费用
  • 山西品牌网站建设信息发布网站有哪些
  • b站网站开发者调试用具百度网站怎么优化排名靠前
  • 广汉做网站郑州seo服务公司
  • 优秀app界面设计模板武汉久都seo
  • 东莞港货网站建设app下载注册量推广平台
  • 潍坊市作风建设年活动网站培训机构最新消息
  • 郑州做景区网站建设公司品牌词优化
  • 开网站挣不挣钱免费建自己的网站
  • 哪里可以下企业网站模板网站推广软文
  • 郑州富士康发布预招工公告廊坊百度关键词优化怎么做
  • 策划网站建设百度做广告推广怎么样
  • 品牌网站建设策怎么做网址
  • 让其他公司做网站的话术网络营销的传播手段
  • 旅游网站建设首选赢旅动力网络营销技巧
  • 网站备案后换空间seo网站优化培训找哪些
  • 2017网站建设有市场吗seo博客网址
  • 怎么在国外网站开发客户深圳优化seo
  • 有哪些搜索引擎网站域名解析ip地址
  • 个人备案网站 论坛无锡网站建设
  • 中级经济师考试题型seo营销工具
  • 湛江企业自助建站关键词搜索引擎又称为
  • wordpress字体怎么改优化设计卷子答案
  • 婚纱影楼网站建设怎么联系百度客服人工服务
  • 教育系统网站备案国际新闻界
  • 公司做网站需准备资料电商培训机构有哪些?哪家比较好
  • 微博营销的方法和手段行者seo