lua 元方法 __index

原方法 __index:

作用用于访问元表中的内容。即当通过键来访问table时,如果这个键没有值,则lua会寻找该table中的 metatable 中的__index键。如果__index指向的是一个able,则lua会在__index指向的table中查找相应的键

Lua 查找一个元表的规则:

1、在表中查找,如果找到,则返回该键指向的值。如果找不到则继续

2、判断该表是否存在元表,如果没有,则返回nil。 如果有元表则继续

3、判断元表中是否存在__index 方法,如果 __index不存在则返回nil。如果__index 方法是一个table,则重复1、2、3. 如果__index 方法是一个函数,则返回该函数的值

1 -- 如果键值不存在则返回 0
2 mtb = setmetatable({},{__index=function(mtable,key)
3         return 0
4     end
5 })


-- 获取指定键的值,如果不存在该键则创建改建并赋给默认值0
mtb = setmetatable({},{__index=function(mtable,key)
        print("I'm here")
        rawset(mtable,key,0)
    end
})

print(mtb.key)
print(mtb.key)

 

原方法 __newindex:

与 __index 不同的是,__newindex 是用来对表进行更新的。

当对表不存在的一个key(索引)赋值时,解释器会查找 __newindex 元方法;如果存在则调用这个函数而不进行赋值操作。

-- 对一个表的键进行赋值,如果不存在该键值则插入键并且赋给用户指定的值
tb = setmetatable({}, {__newindex=function(bb,key,value )
    rawset(bb,key,value)
end})
元方法 说明
__add 对应运算符“+”
__sub 对应运算符“-”
__mul 对应运算符“*”
__div 对应运算符“/"
__mod 对应运算符"%"
__unm 对应运算符"-"
__concat 对应运算符".."
__eq 对应运算符"=="
__lt 对应运算符"<"
__le 对应运算符"<="

 

 

 

 

 

 

 

 

这里的原方法与 C++中的运算符重载类似,不过在lua里面原方法的使用更加灵活

其他方法:

__call :当元组调用一个值时,进行调用

__tostring:  类似与 C# 中的 ToString 方法,用于改变元组输出的行为

posted @ 2017-08-23 19:22  熊二  阅读(573)  评论(0编辑  收藏  举报