如何理解Lua中的metatable?

Bru*_*ang 2 lua metatable torch

我使用过Python,但现在我因为Torch而学习Lua."metatable"这个词对我来说真的很难理解.例如,是一种特殊的表格吗?它如何改变表的行为?

Nic*_*las 9

metatable只是一个用于控制另一个表(或userdata)行为的表.表是metatable只是因为它被用作元表.也就是说,作为"metatable"并不是表格的基本属性.没有"create_metatable"函数或任何东西.它只是我们用于表格的名称,用于控制其他表格.

对表(或userdata)的某些操作被指定为首先检查表的metatable.如果表(或userdata)具有metatable,并且metatable在其中具有某个键/值对,则操作将使用该键/值对来执行该操作而不是正常逻辑.

可被metatable覆盖的每个操作都有一个与之关联的特定键名.因此,如果您尝试在表上执行添加,系统将__add在metatable中查找密钥以便访问它.

该对中的值通常(但不总是)是一个函数.这些功能通常称为"元功能".它所采用的参数及其返回值的含义由调用它的特定操作定义.一些操作允许值为表或其他内容.

在Lua中,您使用该setmetatable函数将metatable分配给表(但不是userdata).从C,您可以使用该lua_setmetatable函数为表(或userdata)分配元表.

Metatables对于将C对象公开为userdata的C代码尤为重要.原始用户数据只是一个不透明的位块; Lua默认定义很少可以对它们执行的合法操作.但是通过为它们分配元数据,您可以通过元函数为用户数据提供更多功能.