Lua中表与元表有何本质区别,它们之间有哪些显著的不同点?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1080个文字,预计阅读时间需要5分钟。
Corona中的表和元表有什么区别?元表有哪些类型?我如何以及在哪里使用它们?使用表和元表的主要目的是什么?Lua(Corona所基于的语言)将元表用于不同的目的。手册中相关的条目是元表。
在Corona中,表(Table)是用于存储键值对的数据结构,而元表(Metatable)是一个特殊类型的表,它控制了表的行为。
1. 表和元表的区别: - 表:存储数据,如数字、字符串、布尔值等。 - 元表:存储关于表行为的信息,如方法(函数)和元方法。
2. 元表的类型: - 默认元表:用于没有指定元表的自定义表类型。 - 内置元表:针对特定类型(如数字、字符串、表等)有内置的元表。 - 用户定义元表:用户可以为自定义表类型创建元表。
3. 如何使用元表: - 在Lua中,可以通过`setmetatable()`函数设置一个表的元表。 - 通过`getmetatable()`函数获取一个表的元表。
4. 使用元表的目的: - 控制表的行为,例如重写加法运算符(`+`)。 - 提供默认的索引访问器。 - 实现表的自定义类型。
5. Lua中的元表应用: - 元表可以用来扩展或重载表的行为。 - 在游戏开发中,元表可以用来实现自定义的对象系统。
6. 手册中的相关条目: - 元表(Metatables):解释元表的概念、如何设置和获取元表,以及元表在Lua中的具体应用。
Corona中表和元表之间有什么区别? metatables有哪些类型?我如何以及在何处使用它们?使用表和元表的主要目的是什么? Lua(Corona所基于的语言)将metatable用于不同的目的.手册中的相关条目是Section 2.8.
一个很好的教程可以在here或here找到.
metatable只是一个像其他任何表一样的表,但是在另一个表上设置为metatable(我将进一步称之为基表,以区分两个表).
metatable可以包含任何内容,但特殊键(以双下划线开头)是有趣的.在此表中设置为此键的值将在特殊情况下调用.哪个场合取决于哪个键.最有趣的是:
> __index:只要查找基表中的键但不存在,就会使用它.这可以包含表,其中将查找键,或者一个函数,它将传递原始表和键.这可以用于实现表上的方法(OOP样式),重定向,通过案例,设置默认值等
> __newindex:只要在表中分配新密钥(之前为零),就会使用它.如果是表,则将在该表中分配密钥.如果它是一个函数,那么该函数将传递原始表,键和值.这可用于控制对表的访问,预处理数据,分配的重定向.
> __call:如果您使用eg,则可以设置要调用的函数.表().
> __add,__ sub,__ mul,__ div,__ mod用于实现二进制操作,
> __unm用于实现一元操作,
> __concat用于实现连接(..运算符)
> __len用于实现长度运算符(#)
> __eq,__ lt,__ le用于实现比较
使用__index&时需要了解一件小事. co.:在这些方法中,你应该使用rawget和rawset以防止每次再调用metamethod,从而导致循环.
举个例子:
t={1,2,3} -- basetable mt={} -- metatable mt.__index=function(t,k) print("__index event from "..tostring(t).." key "..k) return "currently unavailable" end mt.__newindex=function(t,k,v) print("__newindex event from "..tostring(t).." key: "..k.." value: "..v) if type(k)=="string" then rawset(t,k,v:reverse()) else rawset(t,k,v) end end mt.__call=function(t,...) print("call to table "..tostring(t).." with arguments: ".. table.concat({...},',')) print("All elements of the table:") for k,v in pairs(t) do print(k,v) end end setmetatable(t,mt) t[4]="foo" -- this will run the __newindex method print(t[5]) -- this will run the __index method t("foo","bar") -- Multiple fall through example: t={} mt={} mt2={} setmetatable(t,mt) -- metatable on base table setmetatable(mt,mt2) -- second layer of metatable mt.__index=function(t,k) print('key '..k..' not found in '..namelookup[t]) return getmetatable(t)[k] end -- tries looking nonexistant indexes up in mt. mt2.__index=mt.__index -- function was written portably, reuse it. t[1]='A' mt[2]='B' mt2[3]='C' namelookup={[t]="t",[mt]="mt",[mt2]="mt2"} print(t[1],t[2],t[3],t[4])
现在这些只是愚蠢的例子,你可以做更复杂的事情.看看这些例子,看看Programming in Lua的相关章节,并进行实验.并尽量不要混淆;)
本文共计1080个文字,预计阅读时间需要5分钟。
Corona中的表和元表有什么区别?元表有哪些类型?我如何以及在哪里使用它们?使用表和元表的主要目的是什么?Lua(Corona所基于的语言)将元表用于不同的目的。手册中相关的条目是元表。
在Corona中,表(Table)是用于存储键值对的数据结构,而元表(Metatable)是一个特殊类型的表,它控制了表的行为。
1. 表和元表的区别: - 表:存储数据,如数字、字符串、布尔值等。 - 元表:存储关于表行为的信息,如方法(函数)和元方法。
2. 元表的类型: - 默认元表:用于没有指定元表的自定义表类型。 - 内置元表:针对特定类型(如数字、字符串、表等)有内置的元表。 - 用户定义元表:用户可以为自定义表类型创建元表。
3. 如何使用元表: - 在Lua中,可以通过`setmetatable()`函数设置一个表的元表。 - 通过`getmetatable()`函数获取一个表的元表。
4. 使用元表的目的: - 控制表的行为,例如重写加法运算符(`+`)。 - 提供默认的索引访问器。 - 实现表的自定义类型。
5. Lua中的元表应用: - 元表可以用来扩展或重载表的行为。 - 在游戏开发中,元表可以用来实现自定义的对象系统。
6. 手册中的相关条目: - 元表(Metatables):解释元表的概念、如何设置和获取元表,以及元表在Lua中的具体应用。
Corona中表和元表之间有什么区别? metatables有哪些类型?我如何以及在何处使用它们?使用表和元表的主要目的是什么? Lua(Corona所基于的语言)将metatable用于不同的目的.手册中的相关条目是Section 2.8.
一个很好的教程可以在here或here找到.
metatable只是一个像其他任何表一样的表,但是在另一个表上设置为metatable(我将进一步称之为基表,以区分两个表).
metatable可以包含任何内容,但特殊键(以双下划线开头)是有趣的.在此表中设置为此键的值将在特殊情况下调用.哪个场合取决于哪个键.最有趣的是:
> __index:只要查找基表中的键但不存在,就会使用它.这可以包含表,其中将查找键,或者一个函数,它将传递原始表和键.这可以用于实现表上的方法(OOP样式),重定向,通过案例,设置默认值等
> __newindex:只要在表中分配新密钥(之前为零),就会使用它.如果是表,则将在该表中分配密钥.如果它是一个函数,那么该函数将传递原始表,键和值.这可用于控制对表的访问,预处理数据,分配的重定向.
> __call:如果您使用eg,则可以设置要调用的函数.表().
> __add,__ sub,__ mul,__ div,__ mod用于实现二进制操作,
> __unm用于实现一元操作,
> __concat用于实现连接(..运算符)
> __len用于实现长度运算符(#)
> __eq,__ lt,__ le用于实现比较
使用__index&时需要了解一件小事. co.:在这些方法中,你应该使用rawget和rawset以防止每次再调用metamethod,从而导致循环.
举个例子:
t={1,2,3} -- basetable mt={} -- metatable mt.__index=function(t,k) print("__index event from "..tostring(t).." key "..k) return "currently unavailable" end mt.__newindex=function(t,k,v) print("__newindex event from "..tostring(t).." key: "..k.." value: "..v) if type(k)=="string" then rawset(t,k,v:reverse()) else rawset(t,k,v) end end mt.__call=function(t,...) print("call to table "..tostring(t).." with arguments: ".. table.concat({...},',')) print("All elements of the table:") for k,v in pairs(t) do print(k,v) end end setmetatable(t,mt) t[4]="foo" -- this will run the __newindex method print(t[5]) -- this will run the __index method t("foo","bar") -- Multiple fall through example: t={} mt={} mt2={} setmetatable(t,mt) -- metatable on base table setmetatable(mt,mt2) -- second layer of metatable mt.__index=function(t,k) print('key '..k..' not found in '..namelookup[t]) return getmetatable(t)[k] end -- tries looking nonexistant indexes up in mt. mt2.__index=mt.__index -- function was written portably, reuse it. t[1]='A' mt[2]='B' mt2[3]='C' namelookup={[t]="t",[mt]="mt",[mt2]="mt2"} print(t[1],t[2],t[3],t[4])
现在这些只是愚蠢的例子,你可以做更复杂的事情.看看这些例子,看看Programming in Lua的相关章节,并进行实验.并尽量不要混淆;)

