首页
学习
活动
专区
圈层
工具
发布

Lua中的元表和元方法

Lua中每个值都可具有元表。 元表是普通的Lua表,定义了原始值在某些特定操作下的行为。你可通过在值的原表中设置特定的字段来改变作用于该值的操作的某些行为特征。...例如,当数字值作为加法的操作数时,Lua检查其元表中的"__add"字段是否有个函数。如果有,Lua调用它执行加法。 我们称元表中的键为事件(event),称值为元方法(metamethod)。...前述例子中的事件是"add",元方法是执行加法的函数。 可通过函数getmetatable查询任何值的元表。 可通过函数setmetatable替换表的元表。...不能从Lua中改变其他类型的元表(除了使用调试库);必须使用C API才能做到。 表和完整的用户数据具有独立的元表(尽管多个表和用户数据可共享元表);每种其他类型的所有值共享一个元表。...所以,所有数字共享一个元表,字符串也是,等等。 元表可以控制对象的数学运算、顺序比较、连接、取长、和索引操作的行为。元表也能定义用户数据被垃圾收集时调用的函数。

2.2K30

lua--迭代器、模块、元表

接着lua的使用,迭代器、模块和元表,元表为重点需要关注的内容 一、迭代器 pairs就是一个迭代器,它的返回值是key和value,下面自定义一个迭代器 定义迭代器语法: function 迭代器名...元表定义和使用 元表和table一样,使用{}定义,使用元表需要和普通表进行结合,调用setmetatable方法 a = {1,2,3} -- 普通表 b = {} -- 元表 c = setmetatable...getmetattable的返回值为元表 2. index元方法 index元方法定义方式为{__index = 值},有两种用途 2.1 结合两张普通表 -- 两张普通表 e = {'a','b'}...f = {c = 'c'} -- 元表将index元方法赋值为f g = {__index = f} -- 为e表设置元表 setmetatable(e,g) print(e['c']) 运行结果...也有两种用途 3.1 将新元素存入另一张普通表中 -- 两张普通表 e = {'a','b'} f = {} -- 元表将newindex元方法赋值为f g = {__newindex = f} -

70910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    其实在Lua中有一个还有一个叫元表的概念,不得不着重地探讨一下。元表在实际地开发中,也是会被极大程度地所使用到。本篇博客,就让我们从Lua查找表元素的过程,来探讨学习一下Lua中的元表。...很多人对Lua中的元表和元方法都会有一个这样的误解:“如果A的元表是B,那么如果访问了一个A中不存在的成员,就会访问查找B中有没有这个成员”。...但对于Lua的表,如果myTable有元表和元方法,情况就不同了。...Lua查找一个表元素的规则可以归纳为如下几个步骤: Step1:在表自身中查找,如果找到了就返回该元素,如果没找到则执行Step2; Step2:判断该表是否有元表(操作指南),如果没有元表,则直接返回...nil,如果有元表则继续执行Step3; Step3:判断元表是否设置了有关索引失败的指南(__index元方法),如果没有(__index为nil),则直接返回nil;如果有__index方法是一张表

    2.4K41

    Python元编程

    大家好,又见面了,我是全栈君   简单定义“元编程是一种编写计算机程序的技术,这些程序可以将自己看做数据,因此你可以在运行时对它进行内审、生成和/或修改”,本博参考Python高级编程>>将对元编程内容进行详细描述...概述   Python元编程有两种方法,一是采用类似“装饰器”的工具对基本元素(例如函数、类、类型)内审和对其进行实时创建和修改,二是运用类型”元类”的方式对类实例的创建过程进行修改,甚至于允许重新设计...Python面对对象编程范式的实现。...元类   元类是Python的一个重要特性,是定义其他类的类,理解其工作方式,最重要的是要知道定义了对象实例的类也是对象,那么它一定有与其相关联的类,所有的类定义的基类都是内置的type类。...3.3 元类的使用   元类是一种非常强大的特性,但总是会是代码更加复杂,将其用于任意类型的类时,这可能会降低代码的鲁棒性,我们必须灵活的使用元类。

    47410

    Python 元类

    那么再来思考一下,到底什么是元类 元类就是用来创建类的“东西”。你创建类就是为了创建类的实例对象,不是吗?但是我们已经学习到了Python中的类也是对象。...type就是Python在背后用来创建所有类的元类。现在你想知道那为什么type会全部采用小写形式而不是Type呢?...因此,元类就是创建类这种对象的东西。type就是Python的内建元类,当然了,你也可以创建自己的元类。...如果你这么做了,Python就会用元类来创建类Foo。小心点,这里面有些技巧。你首先写下class Foo(object),但是类Foo还没有在内存中创建。...那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。” —— Python界的领袖 Tim Peters

    1.9K30

    Python 元类

    印象中,是在创建单例模式时知道可以用到元类(metaclass),但始终对其了解的不是很透彻,很多人也都说元类是Python中较难理解的概念之一,于是找来几本书,希望可以找到答案,本文以Python3为例...本文参考: 《人人都懂设计模式》 《Python Cookbook》 《 流畅的Python》 先来简单介绍下:元类(metaclass)是一个类,你也可以理解为类的类,因为Python中的类是在运行时动态创建的...,那么通过元类便可以控制类属性和类实例的创建过程。...因为,在Python中,type是默认的metaclass(内建元类),Python允许我们自定义metaclass,自定义的metaclass必须继承自type,也就是:元类从type类继承了构建类的能力...__class__ Out[14]: type 当你使用class关键字时,Python在幕后做的事情,就是通过元类来实现的。 为什么重新定义__call__方法?

    99110

    触类旁通:从元表到元方法,Lua编程的奇妙之旅

    一、元表的概念元表可以修改一个值在面对一个未知操作时的行为。可以认为,元表是面向对象领域中的受限制 像类一样,元表定义的是实例的行为。...由于元表只能给出预先定义的操作集合的行为,所以元表比类更受限;同时,元表也不支持继承。...)==t1) trueLu 语言中只能为表设置元表; 如果要为其它类型值设置元表,则必须通过C代码或调试库完成。...字符串标准库为所有的字符串都设置了同一个元表,而其他类型在默认情况都没有元表。...七、总结一个表可以成为任意值的元表,一组相关的表也可以共享一个描述了它们共同行为的通用元表,一个表还可以成为它自己的元表,用于描述其自身特有的行为。总之,任何配置都是合法的。

    45100

    Hudi元数据表(Metadata table)解析

    元数据表的作用 ApacheHudi元数据表可以显著提高查询的读/写性能。元数据表的主要目的是消除“列出文件”操作的要求。 读取和写入数据时,会执行文件列表操作,以获取文件系统的当前视图。...多模式索引被实现为包含元数据表中的索引的独立分区。 启用Hudi元数据表和多模式索引 在 0.11.0 中,默认启用具有同步更新和基于元数据表的文件列表的元数据表。...如果在启用后关闭元数据表,请确保在再次启用元数据表之前等待几次提交,以便元数据表被完全清理。 多模式索引在 0.11.0 版本中引入。 默认情况下它们被禁用。...部署注意事项 为了确保元数据表保持最新,在不同的部署模型中,同一Hudi表上的所有写操作都需要额外的配置。在启用元数据表之前,必须停止同一表上的所有写入程序。...这是为了在启用元数据表时保证乐观并发控制的正确行为。 不遵循配置指南会导致数据丢失。 请注意,仅当在此部署模型中启用了元数据表时,才需要这些配置。

    3K20

    hive的数据存储(元数据,表数据)和内部表,外部表,分区表的创建和区别作用

    hive的数据存储: 首先弄清楚什么是元数据和表数据:元数据就是表的属性数据,表的名字,列信息,分区等标的属性信息,它是存放在RMDBS传统数据库中的(如,mysql)。...表数据就是表中成千上万条数据了。...hive的存储过程:启动hive时,会初始化hive,这时会在mysql中生成大约36张表(后续随着业务的复杂会增加),然后创建表,会在mysql中存放这个表的信息(不是以表的形式存在的,而是把表的属性以数据的形式放在...而内部表则不一样; 2、在删除内部表的时候,Hive将会把属于表的元数据和数据全部删掉;而删除外部表的时候,Hive仅仅删除外部表的元数据,数据是不会删除的! 3....桶表用的领域很少,一般用在表连接中,有两个表,有一个外键是连接字段,我们的这一个表里面的字段和另外一个的连接字段的值是相同的,hash后的值应该也相同,分桶的话会分到相同的桶中,在进行表连接的时候就比较方便了

    2.3K20

    Python 元类(MetaClass)

    Python 动态语言的动态特性 Python是解释运行的动态语言,它与Java最大的不同是Java的类和方法是在编译时完成定义的,而对Python来说,类和函数在解释器进行解释时动态创建。...元类(MetaClass) MetaClass,直译过来就是元类,顾名思义,就是类的类,如果说class是object的模板,那么MetaClass就是class的模板(Java使用抽象类或者接口来做类的模板...https://en.wikipedia.org/wiki/Metaclass 元类的命名规则是 名字 + MetaClass #说明 python中双下划线加名字再加双下划线的变量名是预先定义的特殊类型...__new__接受4个参数用以创建对象(类也是对象,别忘了),分别是: cls 要创建的对象 name 创建对象使用的类名 bases 创建对象使用的类的基类 attr 创建对象使用的类的属性(方法表)...如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。” —— Python界的领袖 Tim Peters

    1.3K80

    将顺序表中非零元素移动到顺序表的前面

    一、问题引入 已知长度为n的线性表A采用顺序存储结构,编写算法将A中所有的非零元素依次移到线性表A的前端 二、分析 直接用两个for循环解决(时间复杂度可能高了点),每查找到一个为0的位置,都在当前位置后面寻找到第一个非零元素的位置...; //顺序表的当前长度 }SqList; //顺 序表的类型定义 //将顺序表中的非零元素移动到顺序表的前端 void MoveList(SqList...int temp=L.data[i]; L.data[i]=L.data[j]; L.data[j]=temp; break;//跳出最近的这层for循环,防止后面的非零元素继续交换...寻找值大于t的第一个元素 for(;j<L.length;i++,j++) { L.data[i]=L.data[j]; } L.length=i; return true; } //将顺序表中的非零元素移动到顺序表的前端...int temp=L.data[i]; L.data[i]=L.data[j]; L.data[j]=temp; break;//跳出最近的这层for循环,防止后面的非零元素继续交换

    75030
    领券