lua 元表操作

先来了解一下lua的元表操作:

在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作。

因此 Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。

例如,使用元表我们可以定义Lua如何计算两个table的相加操作a+b。

当Lua试图对两个表进行相加时,先检查两者之一是否有元表,之后检查是否有一个叫"__add"的字段,若找到,则调用对应的值。"__add"等即时字段,其对应的值(往往是一个函数或是table)就是"元方法"。

有两个很重要的函数来处理元表:

  • setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。
  • getmetatable(table): 返回对象的元表(metatable)。
几个不太熟悉的元表方法:rawget:rawget是为了绕过__index而出现的,直接点,就是让__index方法的重写无效rawset:rawset是在设置值的过程,进行处理,比如:当某个值改变时,触发事件。或修改某个key为新值。

  1.__index元方法:

   setmetatable(tb, { __index = function()  return "not find"  end })

      local tb = {} setmetatable(tb, { __index = function() return "not find" end })

      tb.version = "正常版本"

     print(tb.version)

      print(tb.server) ---不存在的值,调用__index方法

--rawget是为了绕过__index而出现的,直接点,就是让__index方法的重写无效

   print(rawget(tb, "version")) --打印 正常版本

     print(rawget(tb, "server")) --打印nil

   

  

    

 

原文地址:https://www.cnblogs.com/xiuxiu55/p/12567849.html

时间: 2024-08-27 11:53:04

lua 元表操作的相关文章

lua元表(metatable)和元方法(metamethod)

元表概念: 引言:Lua中的每个值都有一套预定义的操作集合,如数字相加等.但无法将两个table相加,此时可通过元表修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定操作. 访问机制:一般的元方法都只针对Lua的核心,也就是一个虚拟机.它会检测一个操作中的值是否有元表,这些元表是否定义了关于次操作的元方法.例如两个table相加,先检查两者之一是否有元表,之后检查是否有一个叫“__add”的字段,若找到,则调用对应的值.“__add”等即时字段,其对应的值(往往是一个函数或是table

lua元表学习

1 a = {1, 2} 2 b= {3, 4} 3 4 vector2 = {} 5 function vector2.Add(v1, v2) 6 if(v1 == nil or v2 == nil)then 7 return nil 8 end 9 local res = {} 10 res[1] = v1[1] + v2[1] 11 res[2] = v2[1] + v2[2] 12 return res; 13 end 14 15 vector2.__add = vector2.Add

[转]LUA元表

lua元表和元方法 <lua程序设计> 13章 读书笔记 lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在创建table时不会创建元表. t = {} print(getmetatable(t)) --显示过元表 此时是nil --可以用setmetatable来设置或修改任何table的元表 t1 = {} setmetatable(t,t1) assert(getmetatable(t) == t1) 任何t

【Cocos2d-x Lua】操作数据库封装类

Lua中操作数据库封装类 使用示例 lua代码: require("DB") -- 保存一个字符串(数据库中存储的数据都是以字符串的形式保存的) DB:getInstance():setString("level",level) -- 根据key(isOpenMusic)返回一个数字,第二个参数为默认返回值 local result = DB:getInstance():getNumber("isOpenMusic",1) -- 根据key(is

lua元表

__index元方法:按照之前的说法,如果A的元表是B,那么如果访问了一个A中不存在的成员,就会访问查找B中有没有这个成员.这个过程大体是这样,但却不完全是这样,实际上,即使将A的元表设置为B,而且B中也确实有这个成员,返回结果仍然会是nil,原因就是B的__index元方法没有赋值.别忘了我们之前说过的:“元表是一个操作指南”,定义了元表,只是有了操作指南,但不应该在操作指南里面去查找元素,而__index方法则是“操作指南”的“索引失败时该怎么办”.这么说有点绕.所以: 举个栗子: fath

lua——元表、元方法、继承

[元表] 元表中的键为事件(event),称值为元方法(metamethod). 通过函数getmetatable查询任何值的元表,通过函数setmetatable替换表的元表. setmetatable(只能用于table)和getmetatable(用于任何对象) 语法:setmetatable (table, metatable),对指定table设置metatable      [如果元表(metatable)中存在__metatable键值,setmetatable会失败] 语法:tm

lua元表与元方法

lua中每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接的,但是对于两个table类型,则不能直接进行"+"操作.这需要我们进行一些操作.在lua中有一个元表(metatable),我们可以通过元表来改变一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作.比如,现在有两个table类型的变量a和b,我们可以通过metatable定义如何计算表达式a+b,具体的在Lua中是按照以下步骤进行的: 1.先判断a和b两者之一是否有元表 2.检查该元表中是否有一

[转]lua元表代码分析

http://lin-style.iteye.com/blog/1012138 版本整理日期:2011/4/21 元表其实就是可以让你HOOK掉一些操作的一张表. 表的定义在ltm.h/c的文件里.对元表的调用在lvm文件里. 来看看是怎么hook的.首先定义了一堆的枚举 Cpp代码 typedef enum { TM_INDEX, TM_NEWINDEX, TM_GC, TM_MODE, TM_EQ,  /* last tag method with `fast' access */ TM_A

lua元表详解

元表的作用 元表是用来定义对table或userdata操作方式的表 举个例子 local t1 = {1} local t2 = {2} local t3 = t1 + t2 我们直接对两个table执行+运算,会报错 lua: /usercode/file.lua:3: attempt to perform arithmetic on local 't1' (a table value) 因为程序不知道如何对两个表执行+运行,这时候就需要通过元表来定义如何执行t1的+运算,有点类似于c语言中