Lua模拟继承行为

lua没有类,但是可以模拟继承,使用lua的metatable:__index

lua的2个重要概念:元表和元方法

local a= {}
local b = {}
print(getmetatable(t))
setmetatable(b,a)
print(getmetatable(b)

元方法,lua提供的给我们使用的元方法有:

__add(a,b)

__sub(a,b)

__mul(a,b)

__div(a,b)

__mod(a,b)

__pow(a,b)

__unm(a) 取反

__concate(a,b) 连接

__len(a) 长度

__eq(a.b)

__it(a,b) 小于

__le(a,b) --<=

__index(t,k) – 索引查询

__newindex(t,k,v) – 更新索引

__call(a,...) – 执行函数

__tostring(a) –字符串输出

__metatable –保护元表??

最重要,最常用的__index, __newindex

  • __index,__newindex

lua访问table的字段时,

  1. 首先判断table是否存在对应的值,如果有则直接返回
  2. 如果没有,查找元表中的__index元方法,返回元方法的返回的值
  3. 如果没有__index元方法,返回nil ,__index也有可能是元表,如果是这种情况,直接查找表中是否有该字段
local a = {a=1,b=2}
local b = {c=3,d=4}
setmetatable(a, {__index=b})
print(a.c)

@param t发起查找的表

@param k 要查找的键值

__index(t,k)



当lua更新(set)某个table的字段的值时

1 判断table是否存在该字段,如果存在,直接赋值

2 如果不存在,查找元表

2 如果元表中的__newindex是个函数,调用函数

3 如果元表中的__newindex是个table,直接对__newindex指向的table赋值

@param t 作为左值的table

@param k 要赋值table的key

@param v 对应的值

__newindex(t,k,v)


与__index和__newindex对应的getter 和setter 是rawset(t,k,v), rawget(t,k)

rawget不会再触发相关的元表和元函数的调用


范例
P.__func = function(file)
    local scope = P.SCOPE[file]
    return  {
        __newindex=function(t,k,v)
            if scope[k]~=nil then
                rawset(t, k..'_'..DEFAULT_LANG_TITLE, v)
            else
                rawset(t, k, v)
            end
        end,
        __index=function(t,k)
            if scope[k]==nil then
                return nil
            else
                local currTitle = P.getLanguageSubfix(currLang)
                local value = rawget(t, k.."_"..currTitle)
                if value == nil or value == "" then
                    value = rawget(t, k.."_"..DEFAULT_LANG_TITLE)
                end
                if value == nil or value == "" then
                    value = rawget(t, k)
                end
                return value
            end

        end}
end



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值