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的字段时,
- 首先判断table是否存在对应的值,如果有则直接返回
- 如果没有,查找元表中的__index元方法,返回元方法的返回的值
- 如果没有__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)
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