• Lua元表


    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)
    
  • 相关阅读:
    提取Word中的标题以及做标记的内容
    洪水暴发时怎么办?
    面朝大海,春暖花开
    洪水过后要注意哪些事项?
    JS判断客户端是否是iOS或者Android
    关于取消网页接口请求的一些思考
    gkENGINE渲染优化
    RMI拓展
    序列化和反序列化
    cve20201938/cve202010487
  • 原文地址:https://www.cnblogs.com/dingxiaowei/p/7643892.html
Copyright © 2020-2023  润新知