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

江西学校网站建设做网站浏览器标签一般放哪

江西学校网站建设,做网站浏览器标签一般放哪,东莞长安网站制作,镇平建设局网站接上文 文章目录 元表__tostring__call__index__newindex运算符元方法其它元表操作 元表 Q#xff1a;为什么要使用元表#xff1f; A#xff1a;在Lua中#xff0c;常常会需要表与表之间的操作。元表中提供了一些元方法#xff0c;通过自定义元方法可以实现想要的功能__tostring__call__index__newindex运算符元方法其它元表操作 元表 Q为什么要使用元表 A在Lua中常常会需要表与表之间的操作。元表中提供了一些元方法通过自定义元方法可以实现想要的功能相当于面向对象中给你一系列方法让你重载。 使用下列代码设置元表 meta{} table{} setmetatable(table,meta) -- 第一个元素为子表第二个元素为元表通常在元表中操作分为三步 操作子表检测是否有元表若有元表检测有无对应元方法没有元方法则返回对应操作本来的处理。若有对应元方法执行元方法。 元方法索引一般以__两个下划线我想这是因为命名私有静态变量常常以一个下划线作为开头作为开头例如下面的例子: __tostring meta {} table{} setmetatable(table, meta) print(table) 输出 table: 00ABA2A8meta {__tostring function () --注意两个下划线return 123end } 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 456end,__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元方法打印了123456和call,123是子表的元素而456是__tostring的返回结果。这意味着__call方法调用了子表作为入参a。并且像我们上面的打印样例一样print(a)方法又同时会调用__tostring的元方法。而table(2)中的参数2很明显被无视了。 现在我们可以确定一个基本规则当使用__tostring和__call元方法时我们定义的第一个参数一定是子表table本身只有定义更多参数才能接收其它入参 meta {__tostring function ()return 456end,__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整个查找的流程其实是 查询子表子表查询失败查询元表有无 __index元方法若有则查询 __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{age1} table2{age2} setmetatable(table1, meta) --无论把元表设置给table1还是table2结果都一样 print(table1 - table2)输出 -1我们发现使用运算符元方法的时候第一个参数也不默认是绑定的子表了。而是根据运算符的左右变量依次给元方法赋值。而且无论元表设置给减数还是被减数最终结果都是不变的。运算符元方法较多这里就不详细列举了从菜鸟教程上直接抄了个表格 元方法描述__add对应的运算符 ‘’__sub对应的运算符 ‘-’__mul对应的运算符 ‘*’__div对应的运算符 ‘/’__mod对应的运算符 ‘%’__unm对应的运算符 ‘-’__concat对应的运算符 ‘..’__pow对应的运算符 ‘^’__eq对应的运算符 ‘’__lt对应的运算符 ‘’__le对应的运算符 ‘’ 在这之中除了正常的数学运算我们还需要讲一下比较特殊的逻辑判断的元方法就是上表中加粗的几列这几个元方法需要运算符的双方都绑定同一个元表。原因是元方法没有提供大于符号运算ab的元方法其实相当于运算ba的原方法这就需要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即使table1和table2内容不同。因为这是我们自定义的元方法我们默认返回的就是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索引默认为niltable2有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)输出 栈溢出上述例子中我们在元方法内部判断t1t2而进行判断时相当于再次调用了__eq元方法因此会无限循环最终导致栈溢出。 其它元表操作 print(getmetatable(table1)) --使用getmetatable方法获得table1的元表地址输出 table: 00BBA320meta { name 2 } meta.__index meta table1 { age 1 } setmetatable(table1, meta) print(rawget(table1,nane)) --rawget方法只查询子表无视元表index输出 nilmeta {} table1 {} meta.__newindex {} setmetatable(table1, meta) table1.age 1 print(table1.age) rawset(table1, age, 1) --rawset方法可以无视元表的newindex直接修改子表 print(table1.age)输出 nil 1
http://www.dnsts.com.cn/news/119890.html

相关文章:

  • 甘肃省城乡和建设厅网站首页网页游戏搬砖赚钱
  • 外链发布平台太原百度seo排名
  • 中山公众号平台商场网站建设手机网站设计尺寸毫米
  • 辛集做网站常州网约车驾驶员资格证网上报名
  • 上海模板网站建站红酒企业网站模板免费下载
  • 网站开发公司代理徐州手机网站建设
  • 比较有特色的网站国微 网站建设
  • 百度网站怎样做推广法律网站建设价格
  • 常州武进区建设局网站百度知道网页入口
  • 网站开发常用的框架网站用品网店进货渠道
  • 网站建设不开单网站首页制作模板
  • 凡科网做的网站保存后就上传了吗如何做网站优化seo
  • vi毕业设计代做网站旅游网站开发设计与实现
  • 云服务器建设网站用什么系统php做购物网站系统
  • 网站的定位分析网页ui素材中心下载
  • 网站优化主要内容背景图网站
  • 计算机关于网站开发的证书模板外贸网站建设
  • 自我做t恤的网站中企动力做销售的经历
  • 企业网站名称怎么写1建设网站的重要性
  • 汽车配件外贸网站建设银行贵阳市网站电话
  • 网站开发后期维护更新又拍云cdn WordPress
  • 云南网站建设及优化界面设计常用软件
  • 网站品牌建设建议网页设计教程基础
  • 做网站公司在哪装修网站怎么做的好
  • 想开个网站怎样开济宁网站建设平台
  • 个人能申请网站吗建展机械有限公司
  • 网站建设中提示页面站长平台官网
  • 网站的开发环境是什么python官方下载
  • 外贸商城 网站建设最好的网页设计软件
  • 做网站不需要编程的软件wap网站服务器