• Lua:元表(metatable)与元方法(meatmethod)


      local _a1 = {20, 1, key1 = "hello", key2 = "world", lang = "lua"}
      local _a2 = {key1 = "hello",key2 = "world"}
    
      print("a2的metatable:",getmetatable(_a2))
    
      setmetatable(_a2, {__index = _a1})
      for _,v in pairs(_a2) do
          print(v)
      end
    
      print("a2的metatable:",getmetatable(_a2))
    
      for k,v in pairs(getmetatable(_a2))do
    	print(k,v)
    	for i,j in pairs(v)do
    		print(i,j)
    	end
      end
    

    a2的metatable: nil
    hello
    world
    a2的metatable: table: 003CBB20
    __index table: 003CAC60
    1 20
    2 1
    key1 hello
    lang lua
    key2 world

    --算术类元方法:字段:__add  __mul  __ sub  __div  __unm  __mod  __pow  (__concat)
    --代码:(两个table相加)
    tA = {1, 3}
    tB = {5, 7}
    
    --tSum = tA + tB
    
    mt = {}
    
    mt.__add = function(t1, t2)
        for k, v in ipairs(t2) do
            table.insert(t1, v)
        end
    	return t1
    end
    
    setmetatable(tA, mt)
    
    tSum = tA + tB
    
    for k, v in pairs(tSum) do
        print(v)
    end
    
    

    1
    3
    5
    7

    --关系类元方法: 字段:__eq __lt(<) __le(<=),其他Lua自动转换 a~=b --> not(a == b) a > b --> b < a a >= b --> b <= a 【注意NaN的情况】
    --代码:
    mt = {}
    function mt.__lt(tA, tB)
        return #tA < #tB
    end
    
    tA, tB = {3}, {1, 2}
    
    setmetatable(tA, mt)
    setmetatable(tB, mt)
    print(tA < tB)
    

    true
     

    --用__index/__newindex来限制访问
    
    function cannotModifyHp(object)
        local proxy = {}
        local mt = {
            __index = object,
        __newindex = function(t,k,v)
            if k ~= "hp" then
            object[k] = v
            end
        end
        }
        setmetatable(proxy,mt)
        return proxy
    end
    
    object = {hp = 10,age = 11}
    function object.sethp(self,newhp)
        self.hp = newhp
    end
    
    o = cannotModifyHp(object)
    
    o.hp = 100
    print(o.hp)
    
    o:sethp(100)
    print(o.hp)
    
    object:sethp(100)
    print(o.hp)

    10
    10
    100

    Window = {}
    Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,}
    Window.mt = {}
    
    function Window.new(o)
        setmetatable(o ,Window.mt)
        return o
    end
    
    Window.mt.__index = Window.prototype
    
    Window.mt.__newindex = function (table ,key ,value)
        if key == "wangbin" then
            rawset(table ,"wangbin" ,"yes,i am")
        end
    end
    
    w = Window.new{x = 10 ,y = 20}
    w.wangbin = "55"
    print(w.wangbin)

    yes,i am

  • 相关阅读:
    flash动态加载多张图片
    使用ASPJPEG添加水印的方法
    利用数据库复制技术 实现数据同步更新
    ASP.NET 2.0中发送电子邮件
    .net2.0 自定义CheckBoxList验证控件
    c#动态创建存储过程中,提示'go' 附近有语法错误解决方案
    MSDB数据库置疑状态的解决方法
    ASP.NET发送邮件_相关参数
    SQL数据库msdb置疑(急)
    SQL2000数据库脱机/只读/紧急模式 修复
  • 原文地址:https://www.cnblogs.com/byfei/p/14104402.html
Copyright © 2020-2023  润新知