LUA 元表和元方法

 

原始访问:rawget (table, index)

返回不触发元表的实际访问结果

参数table:指定表,参数index:指定索引

 

__index:访问表中不存在的字段时触发

访问表中不存在的字段时,LUA会首先查找__index元方法,如果没有找到则返回nil,如果找到了则按这个方法执行或表中相同的字段执行。

 

__index可以是表或函数

当__index是函数时,LUA会将这个表的地址和不存在的字段作为两个参数来调用元方法。

当__index是表时,LUA会使用这个不存在的键去寻找表中对应的键然后取值。

do
    t = {}               -- 这是一个对象
    mt = {}              -- 元表
    mt.__index = {lv=60, health=50000} -- 当__index是一个表时

    t.new = function (name)     -- 实例化对象
        local newt = {}         -- 每次引用时创建一个新表
        setmetatable (newt, mt) -- 设置元表
        newt.name = name        -- 初始化名字属性
        return newt             -- 返回初始化后的表
    end

    player1 = t.new("达达")  -- 实例化一个对象,给一个名字
    print (player1.name)    -- 输出他的name属性
    print (player1.lv)      -- 试图输出对象不存在的字段,该操作会触发元表__index,在表中寻找不存在的字段
    print (player1.health)  -- 同上
    player2 = t.new("小田")  -- 实例化另一个对象,给一个名字
    print (player2.name)
    print (player2.lv)
    print (player2.health)
--[[
    达达
    60
    50000
    小田
    60
    50000
--]]
end

 

posted @ 2022-01-13 19:56  黑姆豆  阅读(214)  评论(0)    收藏  举报