首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Lua学习笔记

    Lua学习笔记:Lua里metatable元表的使用

    - 尝试获取元表 local mt_got = getmetatable(t) if mt_got == nil then print("The table does not have a metatable .") else print("The table has a metatable.") end --输出 The table does not have a metatable. - 尝试获取元表 local mt_got = getmetatable(t) if mt_got == nil then print("The table does not have a metatable .") else print("The table has a metatable.") end --输出 The table has a metatable.

    74820编辑于 2024-09-13
  • 来自专栏用户7737280的专栏

    先检查两者之一是否有元表(metatable

    当Lua语言试图将两个表相加时,它会先检查两者之一是否有元表(metatable)且该元表中是否有__add字段。

    79830编辑于 2021-11-30
  • 来自专栏葵花宝典007

    关于lua的一些浅析

    lua的table无疑是最最灵活的结构了,对象有属性和方法构成,我们用table描述对象的属性,lua的function用来表示方法,那么lua中的类通过table+function模拟出来,至于继承,metatable lua中的metatable类似于c++中的虚函数,当索引table的项不存在时候,进一步索引metatable(得有设置元表)。 关于setmetable(table,metatable),【如果元表(metatable)中存在__metatable键值,setmetatable会失败】,这句话我第一眼看理解错了,意思是说如果这个表已经设置了元表 ,而那个已经设置的原表中含有__metatable字段,那么在set别的元表就会报错,说白了使用__metatable就是保护元表,禁止用户访问元表中的成员或者修改元表,继承的使用就是利用setmetatable

    48640编辑于 2022-07-17
  • 来自专栏Unreal游戏开发

    UnLua invalid property问题定位与修复

    再下面是关键,这里判断了Field->IsInherited(),如果这个变量是继承来的,就需要到父类的metatable中拿,因为生命周期是跟随父类UClass的。 其次,不管是不是父类,缓存都存在property所属的UClass的metatable。那么问题就是为什么UClass失效了,它的metatable没有被清理? UClass的metatable是在NotifyUObjectDeleted时通过FClassRegistry::StaticUnregister清理的。 因此读到了A类型metatable中缓存的property。 这里为什么会用到旧的metatable呢,理论上GetFieldInternal里面会检查ClassDesc的有效性,无效就会注销并且清理metatable

    78261编辑于 2023-10-30
  • 来自专栏王亚昌的专栏

    Lua中的元表和元方法

    function getbinhandler (op1, op2, event) return metatable(op1)[event] or metatable(op2)[event] local h = metatable(op). (op1)[event] local mm2 = metatable(op2)[event] if mm1 == mm2 then return mm1 else __index if h == nil then return nil end else h = metatable(table). if type(func) == "function" then return func(...) -- 调用原语 else local h = metatable(

    2.3K30发布于 2019-05-26
  • 来自专栏《C++与 AI:个人经验分享合集》

    Lua 中的元表(Metatable)在实际开发中的高级应用场景有哪些?

    Lua 中的元表(Metatable)是 Lua 语言中一个重要的特性,它可以用于实现对象的特殊行为,通过改变对象的元表可以改变对象的默认行为。

    44800编辑于 2024-12-09
  • 来自专栏orientlu

    lua 和 cpp 互调

    设置为 全局 mt.student luaL_getmetatable(L, STUDENT_METATABLE); lua_setmetatable(L, -2); return **s = (Student**)luaL_checkudata(L, 1, STUDENT_METATABLE); luaL_argcheck(L, s ! ); // push metatable lua_pushvalue(L, -1); // push metatable, 下一个设置会pop /* now l stack * __index = mt,Student lua_setfield(L, -2, "__index"); // set and pop metatable luaL_setfuncs(L , m_student_metatable, 0); luaL_newlib(L, m_lib); // push m_lib return 1; } 编译; g++ -Wall

    1.1K40发布于 2018-12-24
  • 来自专栏Unity3d程序开发

    Lua:table与object

    然而当格式化一个对象的 时候,tostring 会首先检查对象是否存在一个带有__tostring 域的 metatable。 所以,raw方法就是忽略table对应的metatable,绕过metatable的行为约束,强制对原始表进行一次原始的操作,也就是一次不考虑元表的简单更新 Packages 基本方法 complex 注意一个小的优 化:我们不需要创建一个额外的表作为 account 对象的 metatable;我们可以用 Account 表本身作为 metatable: 面向对象new function Account 特别是,一个类不能同时是其实例的 metatable 又是自己的 metatable。 在下面的实现中,我们将一个类作为他的实例的 metatable,创建另一个表作为类的 metatable: local function search (k, plist) for i=1, table.getn

    56630编辑于 2023-08-24
  • 来自专栏H2Cloud

    LUA面向对象编程技巧

    Metatable Lua中的metatable 类似于C++中的虚函数,当索引table中的项不存在时,会进一步索引metetable(如果设置了的话)是否存在该项。这跟虚函数概念 不是很吻合么? __index 是跟设置metatable有关,详细信息参见lua manual http://www.lua.org/manual/5.1/ 实际上__index 应该赋值为function,这里是一个语法糖 user_t对象代码如下: local user = user_t:new(1122334) user:dump() new 函数返回一个table, 当索引dump时,obj中没有dump函数,尝试去metatable 实现继承 原理就是利用metatable,__index 设置这样的function,当前类不存在某项时,尝试去基类中查出 person_t = {} person_t.

    1.9K40发布于 2018-03-09
  • 来自专栏Unity3d程序开发

    Lua工具类:pack遇到nil截断,闭包绑定,深拷贝,字符串形式输出表中的内容

    = {} local level = 0 local rep = string.rep local dump_metatable = dump_metatable local max_level _dump(v, level + 1, dump_metatable).."\n" else str = str..(tostring(v) or type(v)).." ,\n" end end if dump_metatable then local mt = getmetatable(tb) if mt ~= nil and type(mt [\"__metatable\"]".." = " if not lookup_table[mt] and ((not max_level) or level < max_level) then _dump(mt, level + 1, dump_metatable).."\n" else str = str..(tostring(v) or type(v)).."

    57310编辑于 2023-08-24
  • 来自专栏静晴轩

    lua Standard Libraries

    Otherwise, if the object’s metatable has a “__metatable” field, returns the associated value. In this case, setfenv returns no values. setmetatable (table, metatable) Sets the metatable for the given (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.

    1.3K90发布于 2018-03-27
  • 来自专栏tkokof 的技术,小趣及杂念

    Sweet Snippet 系列之 Clone Lua Table

    没有处理metatable(元表) 2. 中存在对自身的引用) 3. table可能定义了__pairs 元方法,代码直接使用pairs遍历table执行拷贝可能存在问题 对于recursive table的问题我们可以通过缓存记录来解决,但是对于metatable lookup_table = {} return clone_table_recur(tbl, lookup_table) end -- NOTE : -- 1. do not handle "metatable

    55130发布于 2018-08-02
  • 来自专栏owent

    我们的Lua类绑定机制

    根据Lua的特性,对一个table而言,rawger找不到的东西会去查找metatable的index。 把table的metatable设为自身,__index设为父类的table。 __index = father 为什么不新建一个table作为metatable,并把__index设为父类呢? 另外就是lua里保存C++对象一定要把metatable设成预定义好的元表。为了保存C++的成员函数,静态函数。 __index end local wrapper = {} local wrapper_metatable = {} setmetatable(wrapper, wrapper_metatable

    2.7K10发布于 2018-08-01
  • 来自专栏游戏开发那些事

    【游戏开发】小白学Lua——从Lua查找表元素的过程看元表、元方法

    因此Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。 --执行方法调用 __tostring(a) --字符串输出 __metatable --保护元表 三、Lua的表元素查找机制 众所周知,Lua的表本质其实是个类似Dictionary的东西,其元素是很多的 下面我们再看一下设置了元表和元方法的代码: father = { prop1=1 } son = { prop2=1 } setmetatable(son, father) --把son的metatable index = father -- 把father的__index方法指向它本身 son = { prop2=1 } setmetatable(son, father) --把son的metatable

    2.5K41发布于 2018-09-12
  • 来自专栏王清培的专栏

    .NET框架设计(常被忽视的框架设计技巧)

    / 34 /// <param name="table"></param> 35 protected virtual void AddTable(MetaTable 12 13 ///

    14 /// Database Table meta. 15 /// 16 public class MetaTable IDE builder. 22 protected override void InitContext() 23 { 24 ORM.Meta.MetaTable metaTable = new ORM.Meta.MetaTable() { Name = "TB_Employee", EntityName = "Employee" }; 25 DataType = ORM.Meta.DataType.NVarchar 29 }); 30 metaTable.Add(new ORM.Meta.MetaColumn

    1.7K80发布于 2018-01-08
  • 来自专栏owent

    tolua++内存释放坑

    tolua++在new一个类的时候,会把类指针作为userdata传入lua,建立metatable并通过tolua_classevents函数给metatable注册魔术方法。 其中前一个用于设置全局metatable缓存。后一个貌似是基类。 比如新建一个Class, 指针是p,lua对象是t。

    3.7K20发布于 2018-08-01
  • 来自专栏sunsky

    Lua 5.1 参考手册

    2.8 - Metatable(元表) Lua 中的每个值都可以用一个 metatable。 这个 metatable 就是一个原始的 Lua table , 它用来定义原始值在特定操作下的行为。 你可以通过在 metatable 中的特定域设一些值来改变拥有这个 metatable 的值 的指定操作之行为。 metatable。 If metatable is nil, removes the metatable of the given table. If the original metatable has a "__metatable" field, raises an error.

    4.6K30发布于 2020-08-20
  • 来自专栏岑玉海

    hbase源码系列(三)Client如何找到正确的Region Server

    return true; // don't cache it }   看一下MetaScanner.metaScan吧,它也是用了new了一个HTable HTable metaTable HRegionInfo.createRegionName(tableName, row, HConstants.NINES, false); Result startRowResult = metaTable.getRowOrBefore HConstants.DEFAULT_HBASE_META_SCANNER_CACHING)); scan.setCaching(rows); // Run the scan scanner = metaTable.getScanner

    2.1K110发布于 2018-03-01
  • 来自专栏owent

    Lua 挺好用的样子

    初步看来,Lua的设计模式和思想很像Javascript,也是原型模型(Javascript里叫prototype,Lua里是metatable) 为了便于理解并且更快上手,特意整理出Lua和Javascript 可以以此和前面的metatable来模拟多态特性 工具和外部支持: Lua嵌入其他语言比较简单。因为Lua的调用是栈式的,不过代码写起来不怎么美观。

    1.2K30发布于 2018-08-01
  • 来自专栏文献分享及代码学习

    单细胞专栏-如何给orig.ident换名字

    ) library(reshape2) library(readxl) library(progeny) library(readr) library(stringr) ##先读取xlsx格式的表格 metatable <- metadata$orig.ident ##left_join:左连接,保留X中得所有观测,这样可以保留原表数据 metadata <- left_join(x = metadata, y = metatable

    10.6K11编辑于 2022-05-10
领券