当前位置: 首页 > 编程笔记 >

Lua中的metatable介绍

骆嘉石
2023-03-14
本文向大家介绍Lua中的metatable介绍,包括了Lua中的metatable介绍的使用技巧和注意事项,需要的朋友参考一下

setmetatable (table, metatable)

Lua 中的每个值都可以用一个 metatable。 这个 metatable 就是一个原始的 Lua table , 它用来定义原始值在特定操作下的行为。 你可以通过在 metatable 中的特定域设一些值来改变拥有这个 metatable 的值 的指定操作之行为。 举例来说,当一个非数字的值作加法操作的时候, Lua 会检查它的 metatable 中 "__add" 域中的是否有一个函数。 如果有这么一个函数的话,Lua 调用这个函数来执行一次加法。

我们叫 metatable 中的键名为 事件 (event) ,把其中的值叫作 元方法 (metamethod)。 在上个例子中,事件是 "add" 而元方法就是那个执行加法操作的函数。

你可以通过 getmetatable 函数来查询到任何一个值的 metatable。

你可以通过 setmetatable 函数来替换掉 table 的 metatable 。 你不能从 Lua 中改变其它任何类型的值的 metatable (使用 debug 库例外); 要这样做的话必须使用 C API 。

每个 table 和 userdata 拥有独立的 metatable (当然多个 table 和 userdata 可以共享一个相同的表作它们的 metatable); 其它所有类型的值,每种类型都分别共享唯一的一个 metatable。 因此,所有的数字一起只有一个 metatable ,所有的字符串也是,等等。

一个 metatable 可以控制一个对象做数学运算操作、比较操作、连接操作、取长度操作、取下标操作时的行为, metatable 中还可以定义一个函数,让 userdata 作垃圾收集时调用它。 对于这些操作,Lua 都将其关联上一个被称作事件的指定健。 当 Lua 需要对一个值发起这些操作中的一个时, 它会去检查值中 metatable 中是否有对应事件。 如果有的话,键名对应的值(元方法)将控制 Lua 怎样做这个操作。
metatable 可以控制的操作已在下面列出来。 每个操作都用相应的名字区分。 每个操作的键名都是用操作名字加上两个下划线 '__' 前缀的字符串; 举例来说,"add" 操作的键名就是字符串 "__add"。 这些操作的语义用一个 Lua 函数来描述解释器如何执行更为恰当。


setmetatable

Sets the metatable for the given table. (You cannot change the metatable of other types from Lua, only from C.) If metatable is nil, removes the metatable of the given table. If the original metatable has a "__metatable" field, raises an error.
This function returns table.

 类似资料:
  • 本文向大家介绍Lua中的metatable详解,包括了Lua中的metatable详解的使用技巧和注意事项,需要的朋友参考一下 Lua 中 metatable 是一个普通的 table,但其主要有以下几个功能: 1.定义算术操作符和关系操作符的行为 2.为 Lua 函数库提供支持 3.控制对 table 的访问 Metatables 定义操作符行为 Metatable 能够被用于定义算术操作符和关

  • 主要内容:__index 元方法,实例,__newindex 元方法,实例,实例,为表添加操作符,实例,__call 元方法,实例,__tostring 元方法,实例在 Lua table 中我们可以访问对应的 key 来得到 value 值,但是却无法对两个 table 进行操作(比如相加)。 因此 Lua 提供了元表(Metatable),允许我们改变 table 的行为,每个行为关联了对应的元方法。 例如,使用元表我们可以定义 Lua 如何计算两个 table 的相加操作 a+b。 当 L

  • 在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作。 因此 Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。 例如,使用元表我们可以定义Lua如何计算两个table的相加操作a+b。 当Lua试图对两个表进行相加时,先检查两者之一是否有元表,之后检查是否有一个叫"__add"的字段,若找到

  • 这一章我们简要地介绍 Lua 语言的基础知识,特别地,我们会有意将讨论放置于 OpenResty 的上下文中。同时,我们并不会回避 LuaJIT 独有的新特性;当然,在遇到这样的独有特性时,我们都会予以说明。我们会关注各个语言结构和标准库函数对性能的潜在影响。在讨论性能相关的问题时,我们只会关心 LuaJIT 实现。 Lua 是什么? 1993 年在巴西里约热内卢天主教大学(Pontifical

  • 本文向大家介绍Lua中os库详细介绍,包括了Lua中os库详细介绍的使用技巧和注意事项,需要的朋友参考一下 这个库通过表os实现 os.clock () 功能:返回一个程序使用CPU时间的一个近似值 例如: 输出: os.date ([format [, time]]) 功能:返回一个按format格式化日期、时间的字串或表 若设置time参数,则按time指定的时间格式化,否则按当前时间格式化

  • 本文向大家介绍Lua中使用元表(metatable)执行算术类元方法实例,包括了Lua中使用元表(metatable)执行算术类元方法实例的使用技巧和注意事项,需要的朋友参考一下 上一节对元表和元方法有了一个初步的认识,这篇就来举个最简单的例子吧,加深一下印象,也为后续内容做准备。 1.元方法名 Lua其实已经规定好了各种算术操作符的元方法名字,如: __add:加法 __sub:减法 __mul