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

Lua中的元表和元方法学习笔记

雍志文
2023-03-14
本文向大家介绍Lua中的元表和元方法学习笔记,包括了Lua中的元表和元方法学习笔记的使用技巧和注意事项,需要的朋友参考一下

元表(metatable)是 Lua 里每种类型的值的默认操作方式的集合,例如,数字可以加减乘除、字符串可以连接合并、table 可以插入一对 key-value 值、函数可以被调用等等,这些操作都遵循其预定义的行为来执行。

而值的默认操作方式不是一成不变的,可以通过元表来修改其行为表现,或者是新定义一些默认没有的操作。例如,当两个 table 相加时, Lua 会检查它们之间的元表里是否有 "__add" 这个函数,如果定义有这个函数, 则调用这个函数来执行一次加法操作。

这里,相加这个操作的函数名 -- "__add" 是元表的键名(元表的键名也称之为事件(event),一般以 2 个下划线 "_" 开头),而 "__add" 函数则是这个相加操作的元方法(metamethod)。对于值的操作,Lua 都将其关联上一个被称作事件的指定健,当 Lua 需要对一个值发起这些操作中的一个时, 它会去检查值的元表里是否有对应事件。如果有,则键名对应的值(元方法)将控制 Lua 怎样去执行这个操作。

getmetatable - 获取元表

Lua 里每个值都有一个元表。table 类型和 userdata 类型的值可以有各自独立的元表,而其他类型的值则是公用其类型所预先定义的元表。例如,可以用 getmetatable 来获取一个字符串的元表:


a = "just a test"

print(getmetatable(a))

上面的操作会输出 "table: 0x7fa8614080f0" 的 table,里面包含着预先定义给字符串的操作方法,其内容结构如下:


-__index-sub [function: 0x7fee39408050]

        -upper [function: 0x7fee394080a0]

        -len [function: 0x7fee39407ec0]

        -gfind [function: 0x7fee39407e20]

        -rep [function: 0x7fee39407fb0]

        -find [function: 0x7fee39407d30]

        -match [function: 0x7fee39407f60]

        -char [function: 0x7fee39407c90]

        -dump [function: 0x7fee39407ce0]

        -gmatch [function: 0x7fee39407e20]

        -reverse [function: 0x7fee39408000]

        -byte [function: 0x7fee39407c40]

        -format [function: 0x7fee39407d80]

        -gsub [function: 0x7fee39407e70]

        -lower [function: 0x7fee39407f10]

Lua 在创建新的 table 时不会创建元表,因此想调用 getmetatable 函数获取其元表的话,只会返回一个 nil 值。


tbl = {}

print(getmetatable(tbl))

setmetatable - 修改元表

对于上面所说的新创建的 table 是空元表的问题,可以用 setmetatable 来修改其元表:


tbl = {}

t1 = {key = "val"}

setmetatable(tbl, t1)

print(getmetatable(tbl))

对于上面所说的 2 个 table 相加的情况,可以给 table 添加一个 __add 的元方法就可以进行相加操作:


t1 = {"a", "b", "c", "d"}

t2 = {5, 6, 7, 8, 9}

 

mt = {}

mt.__add = function(a, b)

    local tbl = {}

    local ret = {}

    for k, v in pairs(a) do tbl[v] = true end

    for k, v in pairs(b) do tbl[v] = true end

    for k, v in pairs(tbl) do

        table.insert(ret, k)

    end

    return ret

end

 

setmetatable(t1, mt)

setmetatable(t2, mt)

 

t = t1 + t2

for k, v in pairs(t) do print(v) end

 类似资料:
  • 本文向大家介绍Lua中的元表与元方法学习总结,包括了Lua中的元表与元方法学习总结的使用技巧和注意事项,需要的朋友参考一下 前言 元表对应的英文是metatable,元方法是metamethod。我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算。在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的

  • 本文向大家介绍Lua学习笔记之表和函数,包括了Lua学习笔记之表和函数的使用技巧和注意事项,需要的朋友参考一下 Lua中的表和函数比较重要,正是因为二者的结合才完成了很多很多的功能,Lua才变得如此的强大,所以有必要仔细的学习一下表和函数。如下的代码体现了表的用法。 接下来学习Lua函数的用法,函数涉及的东西比较多,不着急,慢慢来。

  • 本文向大家介绍举例说明Lua中元表和元方法的使用,包括了举例说明Lua中元表和元方法的使用的使用技巧和注意事项,需要的朋友参考一下 table的元表提供了一种机制,可以重定义table的一些操作。 之后我们会看到元表是如何支持类似js的prototype行为。 如果在table中直接查找key失败,会使用元表的__index 继续查找,并且是递归的查找  __index的值也可以是函数functi

  • 本文向大家介绍Lua入门学习笔记,包括了Lua入门学习笔记的使用技巧和注意事项,需要的朋友参考一下 最近在使用Cocos2d-x + Lua来开发游戏。 游戏的主要逻辑将在Lua里写,之前没有接触过Lua,以下是我总结的入门笔记。 运算符 逻辑运算符 与:and 或:or 非:not 逻辑判断只有在false和nil时为假,其余均为真。 or和and会返回第一个断路的值。 Lua中没有C语言的三元

  • 本文向大家介绍Swift学习笔记之元组(tuples),包括了Swift学习笔记之元组(tuples)的使用技巧和注意事项,需要的朋友参考一下 元组 元组(tuples)是由其它类型组合而成的类型。元组可能包含零或多个类型,比如 字符串、整数、字符、布尔以及其它元组。同时请注意,元组是值传递,而不是引用。 在Swift中创建元组的方式很简单,元组类型是用括号包围,由一个逗号分隔的零个或多个类型的列

  • 本文向大家介绍Lua中的元方法__newindex详解,包括了Lua中的元方法__newindex详解的使用技巧和注意事项,需要的朋友参考一下 好吧,我写文章的进度已经赶不上看书的进度了,简单的几段文字就够我唠叨一篇文章了。 今天继续来说说元方法,与__index有点相似的__newindex元方法。 1.查询与更新 上一篇文章我们介绍了__index元方法,总结来说,__index元方法是用于处

  • 本文向大家介绍Lua基础教程之表(Table)学习笔记,包括了Lua基础教程之表(Table)学习笔记的使用技巧和注意事项,需要的朋友参考一下 表 定义表(Table)的方式:a = {}, b = {…} 访问表的成员:通过“.”或者“[]”运算符来访问表的成员。注意:表达式a.b等价于a[“b”],但不等价于a[b] 表项的键和值:任何类型的变量,除了nil,都可以做为表项的键。从简单的数值、

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