美文网首页
2018-08-02

2018-08-02

作者: AbnerTan | 来源:发表于2018-08-06 21:11 被阅读0次

lua实现继承,重载和多态(上)


*讲到lua的继承等面向对象的实现,首先得讲一下lua中的几个元方法和元表.

setmetatable元方法

  • lua中本身是没有面向对象的,但是这并不妨碍我们实现这么一套机制,我们需要知道以下几点
  • lua在查找table中的变量查找不到的情况下,会去对应的table下访问__index表,如果没有数据,则返回nil,如果有则返回对应的数据
  • 通过setmetatable的元方法我们可以设置对应的__index元表
  • 通过getmetatable可以获取当前对应__index元表,如果元表不存在则返回nil.
local mt = {name = "abner", addr = "hangzhou"}
local tp = {name = "joy"}
setmetatable(tp,{__index=mt})
print(tp.name,  tp.addr)

result

result.png
  • 很显然我们可以看到,当tp中找不到对应的数据的时候他会去设置了__index的表中查找数据, 这样是不是就实现了oop中的继承的方式

rawset元方法

  • 可以不调用任何元表或者设置任何元方法就可以将table[index]的值设置成我们想要的值;举个栗子,拿上面的代码说吧,比如我们需要修改tp.addr的值,这时候时候是会去对应的__newindex元表,根据__newindex的逻辑进行设置,但是如果我们是直接使用rawset方法去设置值就可以直接跳过__newindex方法
local mt = {name = "abner", addr = "hangzhou"}
setmetatable(mt, {__index =function (t, k)
    print("正在查询值:", k, v)
end,
__newindex = function (t, k , v)
    print("新添加的数据: ",t, k , v)
end})

-- mt.addr = "changsha"
mt.tp = "demo"
print(mt.tp)

rawset(mt, "tp", false)
print(mt.tp)

result

result.png

__index元表和__newindex元表

  • 简单的说,在__index元表是用来查询值的,__newindex是用来添加新的值的(在__index中查找不到的值)
    这个从上面的栗子我们也能很清晰的看出来

转载请写明出处:https://www.jianshu.com/p/69c297507b2e

相关文章

  • 2018-08-02

    2018-08-02

  • 2018-08-13

    2018-08-02 梁新平 2018-08-02 21:26 · 字数 617 · 阅读 0 · 日记本 【月度...

  • 2018-08-02

    2018-08-02 哈利波特二代 2018-08-02 10:32 · 字数 259 · 阅读 0 · 日记本 ...

  • 用户层~内核层通信(netlink 内核层)

    layout: posttitle: netlink通信机制-内核层date: 2018-08-02 02:01:...

  • 国际冠军杯|阿森纳 VS 切尔西

    国际冠军杯/吉尼斯杯 比赛时间:2018-08-02 星期四 03:00 欧洲指数:2.84 3.90 2.27 ...

  • 忆梅☕️玉露

    小径银珠弹,裙裾芳馥染。田田迎清风,换作茶一盏。 忆梅2018-08-02

  • 读懂芯片IC的datasheet

    读懂datasheet 2018-08-02 做电子设计,难免要读datasheet,而优质的中文版可遇不可求,...

  • 2018-08-02

    2018-08-02 f红艳 事件:今天和儿子讨论十二条快乐软件,关于界限与底线。 感受:失望,惊讶,平静。 想法...

  • 欧冠杯:格拉茨风暴 VS 阿贾克斯

    欧冠杯竞彩 比赛时间:2018-08-02 星期四 02:30 欧洲指数:3.70 3.65 1.90 亚洲初数:...

  • 20180930

    往后余生,我想以自己喜欢的方式度过 流浪摄影师 关注 2018-08-02 13:33 · 字数 1127 · 阅...

网友评论

      本文标题:2018-08-02

      本文链接:https://www.haomeiwen.com/subject/lzyevftx.html