求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 
 

Lua 教程
Lua开发环境
Lua基本语法
Lua变量
Lua数据类型
Lua运算符
Lua循环
Lua决策
Lua函数
Lua字符串
Lua数组
Lua迭代器
Lua表格
Lua模块
Lua元表
Lua协同程序
Lua文件I/O
Lua错误处理
Lua 高级教程
Lua调试
Lua垃圾收集
Lua面向对象
Lua Web编程
Lua数据库/MYSQL操作
Lua游戏编程
Lua标准库
 
 

Lua元表
889 次浏览
32次  

元表是一个表,有助于改变它连接到一个密钥集和相关的元方法的帮助下表的行为。这些元方法是强大的lua功能,如:

1.更改/添加功能,以运算符表

2.查看metatables当钥匙不在使用__index元表中的表可用。

有迹象表明,在处理metatables其中包括使用了两种重要的方法,

1.setmetatable(table,metatable): 这个方法是用来设置元表的一个表。

2.getmetatable(table): 此方法用于获取表的元表。

让我们先来看看如何设置一个表作为另一个元表。它如下所示。

mytable = {}
mymetatable = {}
setmetatable(mytable,mymetatable)

上面的代码可以在一个单一的行被表示为如下所示。

mytable = setmetatable({},{})

__index

元表的查找元表时,它不是在表中提供一个简单的例子如下所示。

mytable = setmetatable({key1 = "value1"}, {
__index = function(mytable, key)
if key == "key2" then
return "metatablevalue" else
return mytable[key]
end
end
}) print(mytable.key1,mytable.key2)

当我们运行上面的程序,会得到下面的输出。

value1	metatablevalue

让解释发生了什么事,在上面的例子中的步骤,

该表mytable 这里 {key1 = "value1"}.

元表设置为mytable中包含一个函数 __index 我们称之为元方法。

元方法确实仰视的索引“key2”一个简单的工作,如果找到,则返回“metatablevalue”,否则返回相应mytable索引的值。

我们可以有上述程序的简化版本,如下所示。

mytable = setmetatable({key1 = "value1"}, 
{ __index = { key2 = "metatablevalue" } })
print(mytable.key1,mytable.key2)

__newindex

当我们增加__newindex到元表中,如果键是没有在表中可用的,新的键的行为将被中继的方法来定义。一个简单的示例,其中元表的索引时,索引不是在主表可设定如下。

mymetatable = {}
mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable }) print(mytable.key1) mytable.newkey = "new value 2"
print(mytable.newkey,mymetatable.newkey) mytable.key1 = "new value 1"
print(mytable.key1,mymetatable.newkey1)

当运行上面的程序,会得到如下的输出。

value1
nil new value 2
new value 1 nil

可以在上面的程序看,如果一个关键存在于主表,它只是更新它。当一个键不可用在maintable,它添加了关键metatable。

该更新用 rawset 函数相同的表的另一个例子如下所示。

mytable = setmetatable({key1 = "value1"}, {
__newindex = function(mytable, key, value)
rawset(mytable, key, """..value..""") end
}) mytable.key1 = "new value"
mytable.key2 = 4 print(mytable.key1,mytable.key2)

当我们运行上面的程序,会得到下面的输出。

new value	"4"

rawset 设定值,而不使用元表 __newindex。同样有rawget,获取的值,而无需使用__index。

表加入操作符的行为

一个简单的例子结合使用+运算符的两个表如下所示。

mytable = setmetatable({ 1, 2, 3 }, {
__add = function(mytable, newtable)
for i = 1, table.maxn(newtable) do
table.insert(mytable, table.maxn(mytable)+1,newtable[i])
end
return mytable
end
}) secondtable = {4,5,6} mytable = mytable + secondtable
for k,v in ipairs(mytable) do
print(k,v)
end

当我们运行上面的程序,会得到下面的输出

1	1
2 2
3 3
4 4
5 5
6 6

该__add密钥包含在元表中添加操作符+行为。表的键和相应的操作符如下所示。

__call

完成方法调用的添加行为,使用__call声明。一个简单的例子,返回值的主表的总和与传递表。

mytable = setmetatable({10}, {
__call = function(mytable, newtable)
sum = 0
for i = 1, table.maxn(mytable) do
sum = sum + mytable[i]
end
for i = 1, table.maxn(newtable) do sum = sum + newtable[i]
end
return sum
end
})
newtable = {10,20,30}
print(mytable(newtable))

当我们运行上面的程序,会得到下面的输出。

70

__tostring

更改打印语句的行为,可以用__toString元方法。一个简单的例子如下所示。

mytable = setmetatable({ 10, 20, 30 }, {
__tostring = function(mytable)
sum = 0
for k, v in pairs(mytable) do
sum = sum + v
end return "The sum of values in the table is " .. sum
end
})
print(mytable)

当我们运行上面的程序,会得到下面的输出。

The sum of values in the table is 60

如果知道元数据表的功能完全,真的可以执行很多操作,这将是不使用它非常复杂。所以尽量让工作使用metatables在元表提供不同的选择作为样本的解释,也可以创建自己的样品。


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



889 次浏览
32次
 捐助