• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua元表

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

元表作用

元表扩展普通表

举例:如果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)

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[lua]实现一个js.bind玩玩发布时间:2022-07-22
下一篇:
lua中得栈发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap