lua元表

原文地址http://www.daileinote.com/computer/lua/13

lua元表其实就是为了扩展表格间的运算,比如之前我们如果让2个表格相加就会报错,一旦我们设置了元表并加上了__add属性,那么就会正常执行。

先看2个元表相关的函数

setmetatable(table,metatable)

将metatable设置为table的元表并返回table,如果metatable为nil,则删除table的元表。
如果table的元表里面存在__metatable则报错。

 

getmetatable(obj)

如果obj没有设置元表,返回nil,如果obj的元表里面有__metatable属性,则返回对应的值。
否则返回obj的元表

__metatable这个元表属性是用来起保护作用的,请看如下例子

local ta = {}

local tb = {__metatable = '沧浪水'}

--把tb设置成ta的元表并返回ta
setmetatable(ta,tb)
--注意由于tb中有__metatable属性,所以会保护ta的元表
--接下来对ta的元表做的所有修改操作都将报错
--试图读取ta的元表的直接返回__metatable对应的值

--试图删除ta的元表
--报错 cannot change a protected metatable
setmetatable(ta,nil)

-- 读取ta的元表
-- 直接返回 沧浪水
local res = getmetatable(ta)

 

__index元方法

比较常用,当我们通过键名去访问一个ta表格时,如果不存在这个键,lua还会尝试搜索ta的元表的__index,没有则返回nil
1.如果__index对应的是表格,直接搜索键名,搜索不到返回nil
2.如果__index所对应的是函数,则调用函数并传递ta和键名参数

例子

local ta = {}
ta['name_url'] = 'http://www.freecls.com'

--nil
print(ta.name)

local tb = {}
tb.__index = {name='沧浪水'}

setmetatable(ta,tb)

--沧浪水
print(ta.name)

--改成函数
tb.__index = function(ta,key)
    return ta[key..'_url']
end

--http://www.freecls.com
print(ta.name)

 

__newindex元方法

当对表格ta设置新值时,会查找ta的元表中是否有__newindex属性,如果存在,则ta赋值,把值赋给__newindex对应的表格

例子

local ta = {}
ta['name_url'] = 'http://www.freecls.com'

local tc = {}

local tb = {}
tb.__newindex = tc

setmetatable(ta,tb)

ta.name = '沧浪水'

print(ta.name)      --nil
print(tc.name)      --沧浪水

 

运算元方法

__add 对应的运算符 '+'
__sub 对应的运算符 '-'
__mul 对应的运算符 '*'
__div 对应的运算符 '/'
__mod 对应的运算符 '%'
__unm 对应的运算符 '-'
__concat 对应的运算符 '..'
__eq 对应的运算符 '=='
__lt 对应的运算符 '<'
__le 对应的运算符 '<='

在这里我只挑一个进行讲解,读者应该可以举一反三

假设我们想实现一个功能,就是2个表格用..操作时,把2个表格的内容合并返回

例子

local ta = {}
ta['url'] = 'http://www.freecls.com'

local tb = {}
tb.__concat = function(ta1,ta2)
    local ta = {}
    for k,v in pairs(ta1) do
        ta[k] = v
    end
    
    for k,v in pairs(ta2) do
        ta[k] = v
    end
    
    return ta
end

--设置元表
setmetatable(ta,tb)


local tc = {1,name='沧浪水',age='28',2}

--将会调用元方法__concat并传入ta,tc作为参数
local res = ta..tc

for k,v in pairs(res) do
    print(k,v)
end

--[[
1	1
2	2
url	http://www.freecls.com
name	沧浪水
age	28
--]]

 

__call元方法

设置了这个元方法,表格可以当做函数来使用

例子

local ta = setmetatable({'http://www.freecls.com'},{
    __call = function(ta1,str)
        print(#ta1)
        print('hello '..str)
    end
})

ta('freecls')

--[[
1
hello freecls
--]]

 

__tostring元方法

设置了这个元方法,可以改变表格的输出行为,默认的情况下会输出表格的内存地址

例子

local ta = {'hello', 'http://www.freecls.com'}

--table: 0x1943700
print(ta)

local ta = setmetatable(ta,{
    __tostring = function(ta)
        local str = ''
        for k,v in pairs(ta) do
            str = str..k..' '..v..'\n'
        end
        
        return str
    end
})

print(ta)

--[[
1 hello
2 http://www.freecls.com

--]]

 

总结

1.本文只是对lua元表做简单的介绍,如果有疑问可以给我留言
2.lua的版本为5.1,运行环境centos7 64位
3.原文地址http://www.daileinote.com/computer/lua/13

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 本套课程分为基础与中级两部分,分别就lua语言的各方面知识点进行探讨,学习完本套课程,对于后续Xlua(Tolua等框架)技术的学习提供强大的语言技术保证。       本套lua课程采用入门与商业级两种开发IDE进行教学:入门级的SciTE内置IDE与商业级的IDEA lua插件。本套课程学习完毕,对于除了传统手游外,在VR、AR、商业级大型应用程序、嵌入式设备开发等领域都有较强的指导作用。           《lua中级篇》分为:“函数的进阶”、“字符串进阶”、“Table进阶”、“元”、“OOP面向对象”、“协同程序”、“IO操作”、“调试与运行”等八个大的章节,详细深入讲解lua开发的方方面面。        内容包含lua可变参数、闭包、模块、函数尾调用、字符串模式匹配、字符串不变性原理、矩阵、链、元详解与应用、协同的生命周期与生产消费者问题、lua文件各种读写操作、lua执行外部代码与错误异常处理垃圾收集机制等。       最后,lua中级篇的学习,对于广大学员开发商业级lua热更新技术,具有不可替代的重要作用! 热更新系列(技术含量:中高级):B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值