Lua教程

Lua 元表(Metatable)

2017-08-31  本文已影响38人  谁说我是小小云

在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作。

因此 Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。

例如,使用元表我们可以定义Lua如何计算两个table的相加操作a+b。

当Lua试图对两个表进行相加时,先检查两者之一是否有元表,之后检查是否有一个叫"__add"的字段,若找到,则调用对应的值。"__add"等即时字段,其对应的值(往往是一个函数或是table)就是"元方法"。

有两个很重要的函数来处理元表:

setmetatable(table,metatable):对指定table设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable会失败 。

getmetatable(table):返回对象的元表(metatable)。

以下实例演示了如何对指定的表设置元表:

以上代码也可以直接写成一行:

以下为返回对象元表:

__index 元方法

这是 metatable 最常用的键。

当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。

我们可以在使用 lua 命令进入交互模式查看:

如果__index包含一个函数的话,Lua就会调用那个函数,table和键会作为参数传递给函数。

__index 元方法查看表中元素是否存在,如果不存在,返回结果为 nil;如果存在则由 __index 返回结果。

实例输出结果为:

实例解析:

mytable 表赋值为{key1 = "value1"}

mytable 设置了元表,元方法为 __index。

在mytable表中查找 key1,如果找到,返回该元素,找不到则继续。

在mytable表中查找 key2,如果找到,返回 metatablevalue,找不到则继续。

判断元表有没有__index方法,如果__index方法是一个函数,则调用该函数。

元方法中查看是否传入 "key2" 键的参数(mytable.key2已设置),如果传入 "key2" 参数返回 "metatablevalue",否则返回 mytable 对应的键值。

我们可以将以上代码简单写成:

总结

Lua查找一个表元素时的规则,其实就是如下3个步骤:

1.在表中查找,如果找到,返回该元素,找不到则继续

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

3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。


内容来自:runoob.com 菜鸟教程

整理:极动云,宁波家电物联网云平台

CONTACT US: http://www.iot-jd.com

上一篇下一篇

猜你喜欢

热点阅读