开发者社区> 蓬莱仙羽> 正文

Lua-元表

简介: Lua-元表 元表作用 元表扩展普通表 举例:如果A+B两个表相加,如果不设置元表的话就会报错,这种情况就可以设置元表来实现,就类似C++的友元函数这种概念 元表设置 mymetable = {} mytable = setmetatabl...
+关注继续查看

Lua-元表

元表作用

元表扩展普通表

举例:如果A+B两个表相加,如果不设置元表的话就会报错,这种情况就可以设置元表来实现,就类似C++的友元函数这种概念

元表设置

mymetable = {}
mytable = setmetatable({}, mymetable)

设置失败情况

当元表有_metatable键值则设置失败
tab = setmatatable({},{_metatable=”sdfsd”})

如果元表设置了这个键值,则getmetatable方法只会返回这个_metatable的值,这样会保护元表使得外界获取不到并且不能修改元表

元表__index元方法

当通过键来访问table的时候,如果这个键不存在则lua会寻找该table的metatable中的__index键,如果__index包含一个table,则会在表格中查找对应的键

mytable = {"LUA","Java", "C#"}
mymetatable = {
    __index = function(tab,key)
        print(tab)
        print("调用了__index方法" .. key)
        return "Javascript"
    end
}
mytable = setmetatable(mytable, mymetatable)
print(mytable[10])

注释:key就是访问mytable的key

元方法__index还可以设置一个表格

mytable = {"LUA","Java", "C#"}
newtable = {7="javascript", 8="PHP"}
mymetatable = {
    __index = newtable
}
mytable = setmetatable(mytable, mymetatable)
print(mytable[7]) --返回javaScript 如果不存在的话则返回nil

元表__newindex元方法

__newindex添加新的数据才会起作用,如果修改已经存在的key不会起作用,他也可以设置表或者数据

mytable = {"LUA","Java", "C#"}
newtable = {7="javascript", 8="PHP"}
mymetatable = {
    --当我们修改一个不存在的key的时候才会触发
    __newindex = function(tab,key,value)
        print("我们要修改的key为"..key.."把这个key值修改为:"..value)
        rawset(tab,key,value)
    end
}
mytable = setmetatable(mytable, mymetatable)
mytable[5] = "C#"

为表添加操作符

mytable = {"LUA","Java", "C#"}
 newtable = {"javascript", "PHP"}
 mymetatable = {
    __add = function(tab, newtab)
        local mi = 0
        for k,v in pairs(ta) do
            if(k > mi) then
                mi = k 
            end 
        end
        for k,v in pairs(newtab) do
           mi = mi + 1
           table.insert(tab, mi, v)
        end
        return tab
    end
 }
 mytable = setmetatable(mytable, mymetatable)
 v = mytable + newtable

还有其他操作符方法
- __add +
- __sub -
- __mul *
- __div /
- __mod %
- __eq ==
- __lt <
- __le <=

元表__call元方法

将表当做方法使用会触发__call方法

 mytable = {"LUA","Java", "C#"}
 newtable = {"javascript", "PHP"}
 mymetatable = {
    __call = function(tab, arg) --arg可以添加无数个参数
       print(arg)
       return "aladdin"
    end
 }
 mytable = setmetatable(mytable, mymetatable)
v = mytable(34)
print(v)

元表中的__tostring的作用

打印table时候调用

 mytable = {"LUA","Java", "C#"}
 newtable = {"javascript", "PHP"}
 mymetatable = {
    __tostring = function(mytable)
       local str = ""
       for k, v in pairs(mytable) do
           str = str .. v ..","
        end
    end
 }
 mytable = setmetatable(mytable, mymetatable)
print(mytable)

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Lua下通过元表模拟OOP编程,继承多态
Lua本身是没有以明确的定义来支持OOP编程的,但是我们却可以通过Lua内核提供的一些特性来间接实现简单的面向对象的编程。  通过Lua中的 table结构  metatable 以及函数可以配合实现OOP,以及继承。
1191 0
lua元表Metatable
Lua 中的每个值都可以用一个 metatable。 这个 metatable 就是一个原始的 Lua table , 它用来定义原始值在特定操作下的行为。 你可以通过在 metatable 中的特定域设一些值来改变拥有这个 metatable 的值 的指定操作之行为。
813 0
Lua脚本是干什么的?底层原理是什么?
Lua脚本是干什么的?底层原理是什么?
14 0
【已解决】Java 项目中利用 Redis 配合 Lua 脚本对短信推送消息做推送限制
【已解决】Java 项目中利用 Redis 配合 Lua 脚本对短信推送消息做推送限制
40 0
如何用wireshark加载自定义.lua脚本
如何用wireshark加载自定义.lua脚本
76 0
iOS小技能:【发红包】使用tweak和lua脚本结合进行实现
我们开发的大部分越狱程序,都是编译成动态链接库(`例如:介绍的越狱程序(Tweak)开发,就是动态链接库。`),然后通过越狱平台的MobileSubstrate(iOS7上叫CydiaSubstrate)来加载进入目标程序(Target),通过对目标程序的挂钩(Hook),来实现相应的功能。
61 0
「Redis」Lua脚本
RedisLua脚本介绍
46 0
+关注
蓬莱仙羽
麦子学院讲师,游戏蛮牛专栏作家,CSDN博客专家,热爱游戏开发,热爱Coding!
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载