元表 【重要】 - 图1
    —— 元表 ——
    —— 元表的概念
    — 任何表变量都可以作为另一个变量的元表
    — 任何表变量都可以拥有自己的元表 (父亲)
    — 当在子表(原本的表)中进行一些特定操作时
    — 会执行元表中的内容
    —— 设置元表
    meta = {}
    _tab
    = {}
    — 第一个参数 子表
    — 第二个参数 元表
    setmetatable(tab, meta)
    print(“####====tostring====####”)
    tostring
    meta2 = {
    — 当子表要被当作字符串使用时,会默认调用这个元表中的
    tostring方法
    _tostring = function()
    return “meta2 tostring”
    end
    }
    _tab2
    = {}
    setmetatable(tab2, meta2)
    print(tab2) —> meta2 tostring

    meta3 = {
    tostring = function(t)
    return t.name
    end
    }
    tab3 = { name = “tab 3” }
    setmetatable(tab3, meta3)
    print(tab3) —> tab 3
    print(“####====call====####”)
    call
    meta4 = {
    call = function()
    print(“meta4 call”)
    end
    }
    tab4 = {}
    setmetatable(tab4, meta4)
    — 当子表被当作一个函数使用时,调用元表的
    call方法
    tab4() —> meta4 call
    ———————————————————————
    meta5
    = {
    tostring = function(t)
    return t.name
    end,
    call = function(i, j)
    — 第一个参数为表本身,第二个参数为传入参数
    print(i, j)
    end
    }
    tab5 = {
    name = “tab5-name”
    }
    setmetatable(tab5, meta5)
    tab5(5) —> tab5-name 5
    print(“####====运算符重载====####”)
    —— 运算符重载
    — 加法 add +
    — 减法
    sub -
    — 乘法 mul *
    — 除法
    div /
    — 取余 mod %
    — 求幂
    pow ^
    — 相等 eq ==
    — 小于
    lt <
    — 小于等于 le <=
    — 连接
    concat ..
    meta6 = {
    — 表间加法
    add = function(t1, t2)
    return t1.age + t2.age
    end,
    — 表间减法
    sub = function(t1, t2)
    return t1.age - t2.age
    end,
    — 相等
    eq = function(t1, t2)
    return t1.age == t2.age
    end
    }
    tab6 = { age = 3 }
    tab7 = { age = 5 }
    setmetatable(tab6, meta6)
    print(tab6 + tab7) —> 8
    print(tab7 - tab6) —> 2
    tab8 = { age = 3 }
    print(tab6 == tab7) —> false
    print(tab6 == tab8) —> true
    print(“####====index====####”)
    _——
    index 和 newindex
    _—
    index 当子表中找不到某一个属性时,会到元表中 index指定的表去找索引
    meta9 = {
    key = 1,
    — 这种写法无效,建议将index的赋值写在表外进行初始化
    index = meta9
    }
    meta9.index = meta9
    tab9
    = {}
    setmetatable(tab9, meta9)
    print(tab9.key) —> 1
    index可以向上套用
    meta10 = {}
    meta10.index = meta10
    tab10
    = {}
    meta10meta = { — meta10的元表
    key = 1
    }
    meta10meta.
    index = meta10meta
    _setmetatable(_tab10
    , meta10)
    setmetatable(meta10, meta10meta)
    — tab10.key最终在meta10meta中找到
    print(tab10.key) —> 1
    print(“####====newindex====####”)
    —— newindex 当赋值时,如果赋值一个不存在的索引
    —— 那么会把这个值赋到
    newindex所指的表中,不会修改子表
    tab11
    = {}
    meta11 = {}
    setmetatable(tab11, meta11)
    tab11.age = 1
    print(tab11.age) —> 1
    tab12 = {}
    meta12 = {}
    meta12.newindex = {}
    setmetatable(tab12, meta12)
    tab12.age = 1
    print(tab12.age) —> nil
    print(meta12.
    newindex.age) —> 1
    newindex与index相同,可以向上嵌套 暂不做演示
    print(“####====getmetatable====####”)
    —— 获取元表的方法getmetatable
    _print(getmetatable(_tab12
    ))
    print(“####====rawget====####”)
    —— rawget 找子表的变量,无视元表的index
    _print(rawget(_tab12
    , “age”)) —> nil
    —— rawset 更改子表变量值,无视元表的newindex
    _print(“####====rawset====####”)
    rawset(_tab12
    , “age”, 3)
    print(rawget(tab12, “age”)) —> 3