首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Lua和元方法

Lua每个值都可具有元。 元是普通Lua,定义了原始值在某些特定操作下行为。你可通过在值设置特定字段来改变作用于该值操作某些行为特征。...例如,当数字值作为加法操作数时,Lua检查其元"__add"字段是否有个函数。如果有,Lua调用它执行加法。 我们称元键为事件(event),称值为元方法(metamethod)。...不能从Lua改变其他类型(除了使用调试库);必须使用C API才能做到。 和完整用户数据具有独立(尽管多个和用户数据可共享元);每种其他类型所有值共享一个元。...这些操作语义通过一个Lua函数描述解释器如何执行操作作了更好说明。 下面显示Lua代码只是说明性;真实行为被硬编码到解释器,并且比这里模拟更加高效。...,而且访问没有元对象不会失败(只是结果为nil)。

1.7K30

lua排序

Lua作为一种很强大且轻量级脚本语言存在,对于掌握其几乎无所不能Table(其实就是一个Key Value数据结构,它很像JavascriptObject,或是PHP数组,在别的语言里叫Dict...对于Lua语言可参见酷壳Lua简明教程这篇Blog。...对于luatable排序问题,一般使用大多是按照value值来排序,使用table.sort( needSortTable , func)即可(可以根据自己需要重写func,否则会根据默认来:默认情形之下...,如果内既有string,number类型,则会因为两个类型直接compare而出错,所以需要自己写func来转换一下;也可根据自己需要在此func 添加相应逻辑来达到你 排序要求); local...;这样实现方式其实与上述将table索引存入一个temp,并将此temp按func排序;只不过这里 使用闭包,将此处理放置在了一个方法内来替代pairs罢了;

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

Lua连续教程之Lua面向对象编程

从很多意义上讲,Lua语言中一张就是一个对象。首先,对象一样,可以拥有状态。...不过,Lua语言无法在a中找到字段”deposit”,所以它会在元index搜索。此时情况大致如下: getmetatable(a)....请注意,当一个index字段为一个函数时,当Lua不能在原来中找到一个键时就会调用这个函数。基于这一点,就可以让index元方法在其他期望任意数量父类查找缺失键。...首先,Lua语言在account找不到字段”getname”;因此,它就查找accountindex字段,在我们示例该字段为NamedAccount。...为了避免未授权访问,表示对象状态不保存在其他字段,而只保存在方法闭包

51920

redislua

目录 0. redis运行lua流程正常流程 1.redislua概要信息     1.1 lua调用redis命令     1.2 redis数据结构与lua数据结构对应关系     ...Redis 3.2以后支持)     2.3 lua脚本可选复制命令 3. redislua脚本debug     3.1 lua脚本记录日志     3.2 Lua debugger...1.redislua概要信息 1.1lua调用redis命令    在lua脚本以2种方式调用redis命令 lua调用redis方式 对异常处理方式 redis.call 遇到异常将抛出...RedisTemplate调用execute方法,第一个参数是脚本对象,第二个参数是个列表对应乱脚本KEYS,之后可变参数对应lua脚本ARGV。.../lock1.lua")); script.setScriptSource(scriptSource); //3.设置Lua脚本KEYS对象 Listkeys

1.7K60

LUA面向对象编程技巧

LUA对象 我们知道,对象由属性和方法组成。LUA中最基本结构是table,So 必须用table描述对象属性。luafunction可以用来表示方法。...那么LUA类 可以通过table + function模拟出来。至于继承,可以通过metetable模拟出来(不推荐用,只模拟最基本对象大部分时间够用了)。 2....Metatable Luametatable 类似于C++虚函数,当索引table项不存在时,会进一步索引metetable(如果设置了的话)是否存在该项。这跟虚函数概念 不是很吻合么?...__index 是跟设置metatable有关,详细信息参见lua manual http://www.lua.org/manual/5.1/ 实际上__index 应该赋值为function,这里是一个语法糖...实现继承 原理就是利用metatable,__index 设置这样function,当前类不存在某项时,尝试去基类查出 person_t = {} person_t.

1.5K40

Lua和元方法

如果Lua语言找到了该字段,就调用该字段对应值,即所谓元方法,在本例中就是用于计算函数。 可以认为,元是面向对象领域中受限制类。像类一样,元定义是实例行为。...Lua 语言就使用这个元方法,与第二个值无关;如果第二个值有元且元存在所需元方法,Lua 语言就使用这个元方法;否则,Lua 语言就抛出异常。...因此我们可以修改被遍历方式和为非对象增加遍历行为。当一个对象拥有__pairs元方法时,pairs会调用这个元方法来完成遍历。...Lua语言还提供了一种改变在两种正常情况下行为方式,即访问和修改不存在字段。 __index元方法 正如我们此前所看到,当访问一个不存在字段时会得到nil。...组合使用元方法index和__newindex可以实现Lua语言中一些强大结构,例如只读、具有默认值和面向对象编程继承。 具有默认值 一个普通中所有字段默认值都是nil。

59740

Lua连续教程之Lua数值

,当需要区分整型值和浮点型值时,可以使用函数math.type: >math.type(3) --integer >math.type(3.0) --float 在Lua5.3: >3 -...因此,数值表示在范围和精度上都是有限制。标准Lua使用64个比特位来存储整型值,其最大值为2^{63}-1,约等于10^{19};精简Lua使用32个比特位存储整型值,其最大值约为20亿。...数学库常量定义了整型值最大值(math.maxinteger)和最小值(math.mininteger)。...64位整型值最大值是一个很大数值:全球财富总和(按美分计算)数千倍和全球人口总数数十亿倍。尽管这个数值很大,但是仍然有可能发生溢出。...>math.maxinteger + 2.0 -- 9.2233720368548e + 18 在上例,两个结果从数学角度看都是错误,而且它们错误方式不同。

4K20

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

引言 在上篇博客,我们简单地学习了一下Lua基本语法。其实在Lua中有一个还有一个叫元概念,不得不着重地探讨一下。元在实际地开发,也是会被极大程度地所使用到。...本篇博客,就让我们从Lua查找元素过程,来探讨学习一下Lua。 一、什么是元Lua table我们可以访问对应key来得到value值,但是却无法对两个table进行操作。...很多人对Lua和元方法都会有一个这样误解:“如果A是B,那么如果访问了一个A不存在成员,就会访问查找B中有没有这个成员”。...如果尝试访问了一个并不存在元素时,就会触发Lua一套查找机制,Lua也是凭借这个机制来模拟了类似“类”行为。...输出为nil原因很简单,myTable并没有prop2这个成员,这符合我们平时操作Dictionary习惯。但对于Lua,如果myTable有元和元方法,情况就不同了。

1.5K30

Luaexcel配置极致优化

前言项目中由于对于启动优化,配置量并不是特别大,但启动时长却不低,但对于应用类来说,对启动时长要求很严格。...我希望能做到毫秒级加载体验,所以有了这个优化旧方案使用pb配置,用工具转成pb格式,启动后加载到lua table原始pb文件在2M多,读取到内存后,会增加20多M内存开销加载时长是高端机500ms...,也是用工具预先转换一下 【】文件头 【】列信息 【】数据全部字符串 【】不定长数组 【】关键列查找 【】行数据(定长结构,如果该列是字符串这类不定长数据...【N】 【值或偏移】通过重载 __index, 直接查找返回相应变量,也正常lua table访问基本一致优化思路1、采用内存文件格式,内存格式与文件格式完全一致,这个完全去除了数据解码开销...这样配置文件大小与CPU性能就不相关了,完全能满足毫秒级加载体验2、数据压缩,减少内存开销 自适应压缩整数,对于boo, 小于255整数,使用1Byte存储 对于小于

77640

Lua:weak,弱,setmetatable(t, {__mode = “k“})

1)luaGC默认是自动回收,当一个对象引用计数为0时,它就会被GC所回收。...2)lua默认是强引用,当你把某个对象放入时,就是生成一个对它强引用(对象引用计数+1),在对象引用计数没有为0之前不会被GC回收; 3)如果把一个声明为弱引用,则当把某个对象放如表时...,生成一个弱引用(对象不会被引用计数,可以理解为引用计数+0);如果一个对象只被弱引用所引用(对象引用计数为0),则会被下一次GC自动回收 所以弱引用weak table用途一般都是出于GC考虑...注意:以上所指对象不包括值类型:number、boolean 当K为弱引用 t = {} --标记tkey为弱引用 setmetatable(t, {__mode = "k"}) key1 =...,t也访问不到key1了 如果注释setmetatable(t, {__mode = “k”}) 这个语句,t[key1] 会导致key1引用 +1,即使 key1 = nil ,仍然访问到t[key1

21620

lua面向对象:new,继承,多态

概述: lua要实现类,继承,多态 BaseClass(super)为生成基类公共方法,内部开辟新以class_type为模板返回,主要为类声明服务,一个类有的__init(构造),__delete...(析构),.super(父类),.New(创建对象),setmetatable(class_type, {__index = _class[super]})设置元,__index指向父类 类声明BaseView...= BaseView or BaseClass() 类继承LoginView = LoginView or BaseClass(BaseView) 通过设置class_type.New,会再返回一个新设置子类...再注册DeleteMe方法,依次调用子类__delete,父类__delete --保存类类型 local _class = {} local lua_obj_count = 0 function...lua_obj_count = lua_obj_count + 1 -- 生成一个类对象 local obj = {_class_type = class_type} --原始,表里有个key

29020

Lua函数使用

10 , y = 20} f({x = 10 , y = 20}) type{} Lua语言也为面向对象风格调用提供了一种特殊语法,即冒号操作符。...形如x:foo(x)表达式意味为调用对象ofoo方法。 一个Lua程序既可以调用Lua语言编写函数,也可以调用C语言编写函数。...要遍历可变长参数,函数可以使用表达式{…}将可变长参数放在一个,就像add示例中所作那样。不过,在某些罕见情况下,如果可变长参数包含无效nil,那么{…}获得可能不再是一个有效序列。...此时,就没有办法在判断原始参数究竟是不是以nil结尾。对于这种情况,Lua语言提供了函数table.pack。...该函数像表达式{…}一样保存所有的参数,然后将其放在一个返回,但是这个还有一个保存了参数个数额外字段”n”。

1.6K20

Lua环境(Environment)

Lua语言通过不使用全局变量方法来解决这个难题,但又不遗余力地在Lua语言汇总对全局变量进行模拟。在第一种近似的模拟,我们可以认为Lua语言把所有的全局变量保存在一个称为全局环境普通。...由于不需要再为全局变量创造一种新数据结构,因此使用一个来保存全局变量一个优点是简化了Lua 语言内部实现。另一个优点是,可以像操作其他一样操作这个。...由于Lua语言将全局变量存放在一个普通,所以可以通过元来访问不存在全局变量情况。...,即Lua语言内部维护一个普通。...不过,任何赋值都会发生在新,虽然我们仍然能通过_G来修改全局环境变量,但如果误改全局环境变量也不会有什么影响。

1.1K20

Sweet Snippet 系列之 Lua排序

作为Lua实现各类数据结构基石,使用想必是贯穿于整个项目的开发过程之中,其中对表内容排序想必亦是常见需求之一,Lua内置Table函数库便提供了sort函数来实现这项功能,但是仅能支持数组部分内容排序...,而想要排序哈希部分内容,简单一个方法就是另写一个迭代器来支持: function order_pairs(tbl) local names_buffer = {} for name...= names_buffer[table_index] return key, tbl[key] end return iterator end 写个简单测试...pairs", [2] = "another", a = "string" } print_table(t) print_table_order(t)   基本就是这么简单~ 更新:   其实之前实现有两个问题...,使用默认comp实现(简单基于字符串比较),在某些情况下会得到非期望排序结果(依赖于字符串比较实现方式),再者也缺少扩展性,无法定制comp,更好实现方式还是开放comp设置,并提供默认实现

39250

lua--迭代器、模块、元

接着lua使用,迭代器、模块和元,元为重点需要关注内容 一、迭代器 pairs就是一个迭代器,它返回值是key和value,下面自定义一个迭代器 定义迭代器语法: function 迭代器名...end -- in后面,跟上迭代器名,终止值,初始值 for i,d in double,10,0 do print(i,d) end 运行结果: image.png 二、模块 lua5.1...开始支持模块,可以将函数封装进模块,在别的脚本引用模块 1....元允许改变table行为,对table变相进行扩展,甚至能达到模拟类功能 1....print(e['c']) print(e[1]) 运行结果: 3. newindex元方法 newindex元方法定义方式为{__newindex = 值},也有两种用途 3.1 将新元素存入另一张普通

37710

Lua函数式编程

sock变量会被GC掉,就要从Lua基本规则说起: 在Lua,一共有8种基本类型: nil、boolean、number、string、function、userdata、 thread 和 table...其中’string,function,userdata,thread,userdata’等需要额外分配内存数据类型均受LuaGC管理。...以往写Lua代码时,我一直以为Lua是“原型对象”编程范式,然而这个“大跟头”让我发现,原来Lua底层基石竟然是“函数式编程”范式(非纯函数式编程语言,Lua函数有副作用)。...在面向对象编程,万物皆对象”。 然后你(主要是我自己)就开始似懂非懂用这些概念去“忽悠”其他人。...自身GC机制会保证,在函数(闭包)没有被回收前,其携带环境变量永远有效。 在Luarequire和chunk机制我摔跟头充分验证了这一点。

1.1K20
领券