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

Lua和元方法

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

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

Lua如何读写JSON

Lua如何读写JSON 测试环境准备 操作系统 CentOS 7.2 64位 Lua版本 5.1.4 安装Lua ?...Lua JSON库 这是常用方法,通过Lua对字符串进行解析,从而完成JSON编码及解码。网络上有许多现成Lua JSON库可以使用。 下载 ? 示例: ?...直接在Linux命令行上执行lua lua_json_test.lua即可完成解码和编码过程 cjson库 上述方法可以达到效果,但是效率会比较差。在实际生产环境,建议使用cjson库提高效率。...直接在Linux命令行上执行lua cjson_test.lua即可完成解码和编码过程 性能比较 分别使用Lua JSON库和cjson库运行500万次解码和编码过程 示例: ?...很明显,cjson库性能要高很多 在生产环境需要用到Lua编解码JSON时,建议优先使用cjson库,以提高性能

8.2K20

redislua

目录 0. redis运行lua流程正常流程 1.redislua概要信息     1.1 lua调用redis命令     1.2 redis数据结构与lua数据结构对应关系     ...1.redislua概要信息 1.1lua调用redis命令    在lua脚本以2种方式调用redis命令 lua调用redis方式 对异常处理方式 redis.call 遇到异常将抛出...该模式缺点: Lua不导出命令来访问系统时间或其他外部状态 RANDOMKEY, SRANDMEMBER, TIME这几个函数在修改数据脚本不能使用,只能用于只读数据脚本。...,但是redis实现了默认按字典排序,保证每次lua脚本访问一致。...5.RedisTemplate如何调用lua脚本示例 1.先将脚本写入XXX.lua文件, 2.之后将XXX.lua文件放入src/main/resources/lua,如下图 ?

1.8K60

使用工具优化Luatable访问

背景写Lua代码似乎不需要考虑性能,毕竟都用Lua了,如果考虑性能直接用C++不就好了。但是勤俭节约是中华民族传统美德,能省点cpu是一点。特别是在Lua使用越来越多时候。...a.b都会触发一次table访问,这样会影响性能。...比如在对a.b写之前,我都可以用一个变量来代替a.b读,这样就可以加速了。但是这里有个问题,Lua是一门特别灵活语言,你甚至不知道a.b是不是一个table。又或者运行变成了一个另一个类型。...结尾搞了这么多细节,最后实际项目中优化效果如何呢?首先,这种替换场景本身就不多,大部分Lua代码写还是比较优秀。其次,优化table访问占整个大盘百分比也是很小。...所以,就像导语说,这是一个聊胜于无优化。当然,对于一些特殊场景,比如本身没什么计算逻辑,但是全是table get,那么优化会有明显效果了。在实际应用,有约10%提升。

47210

Lua和元方法

例如,假设a和b都是,那么可以通过元定义Lua语言如何计算表达式a+b。当Lua语言试图将两个表相加时,它会先检查两者之一是否有元且该元是否有__add字段。...这个元定义了这些应该如何执行加法操作。首先,我们创建一个普通,这个被用作集合LUA local mt = {} 然后,修改用于创建集合函数 Set.new。...Lua语言还提供了一种改变在两种正常情况下行为方式,即访问和修改不存在字段。 __index元方法 正如我们此前所看到,当访问一个不存在字段时会得到nil。...当元方法是一个时,Lua语言就访问这个。因此,在我们此前示例,可以把index`简单地声明为如下样式: mt....跟踪对表访问 假设我们要跟踪对某个所有访问。由于index和newindex元方法都是在索引不存在时才有用,因此,捕获对一个访问唯一方式是保持是空

63140

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 在上例,两个结果从数学角度看都是错误,而且它们错误方式不同。

4.1K20

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

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

1.6K30

Luaexcel配置极致优化

前言项目中由于对于启动优化,配置量并不是特别大,但启动时长却不低,但对于应用类来说,对启动时长要求很严格。...我希望能做到毫秒级加载体验,所以有了这个优化旧方案使用pb配置,用工具转成pb格式,启动后加载到lua table原始pb文件在2M多,读取到内存后,会增加20多M内存开销加载时长是高端机500ms...,也是用工具预先转换一下 【】文件头 【】列信息 【】数据全部字符串 【】不定长数组 【】关键列查找 【】行数据(定长结构,如果该列是字符串这类不定长数据...【N】 【值或偏移】通过重载 __index, 直接查找返回相应变量,也正常lua table访问基本一致优化思路1、采用内存文件格式,内存格式与文件格式完全一致,这个完全去除了数据解码开销...找描字符串,拆分长字符串(比如路径),拆两成两个部分,公共路径只存一个,减少字符串长度3、查询速度优化 使用定长二维格式,支持按行列随机访问,内存连续,Cpu Cache命中率高

81140

Lua函数使用

当这个函数被调用时,Lua内部会把它所有参数收集起来,我们把这些被收集起来参数称为函数额外参数。当函数要访问这些参数时仍需用到三个点,但不同是此时这三个点是作为一个表达式来使用。...要遍历可变长参数,函数可以使用表达式{…}将可变长参数放在一个,就像add示例中所作那样。不过,在某些罕见情况下,如果可变长参数包含无效nil,那么{…}获得可能不再是一个有效序列。...此时,就没有办法在判断原始参数究竟是不是以nil结尾。对于这种情况,Lua语言提供了函数table.pack。...该函数像表达式{…}一样保存所有的参数,然后将其放在一个返回,但是这个还有一个保存了参数个数额外字段”n”。...关于尾调用消除一个重点就是如何判断一个调用是尾调用。很多函数之所有不是尾调用,是由于这些函数在调用之后还进行了其他工作。

1.6K20

Lua环境(Environment)

Lua语言通过不使用全局变量方法来解决这个难题,但又不遗余力地在Lua语言汇总对全局变量进行模拟。在第一种近似的模拟,我们可以认为Lua语言把所有的全局变量保存在一个称为全局环境普通。...我们可以使用下面的代码来实现相同效果,但效率却比之前高出一个数量级: value = _G[varname] 由于全局环境是一个普通,因此可以简单地使用个对应键直接进行索引。...由于Lua语言将全局变量存放在一个普通,所以可以通过元访问不存在全局变量情况。...现在,让我们看看Lua语言是如何构建这种幻觉。 首先,让我们忘掉全局变量而从自由名称概念开始讨论。一个自由名称是指没有关联到显示声明上名称,即它不出现在对应局部变量范围内。...一旦改变了环境,所有的全局访问就都将使用新: --将当前环境改为一个新 _ENV = {} a = 1 -- 在_ENV创建字段 print(a) -- stdin:4:attempt to

1.1K20

MySQL 如何查询包含某字段

查询tablename 数据库 以”_copy” 结尾 select table_name from information_schema.tables where table_schema='tablename...' and table_type='base table' and table_name like '%_copy'; information_schema 是MySQL系统自带数据库,提供了对数据库元数据访问...information_schema.tables 指数据库(information_schema.columns 指列) table_schema 指数据库名称 table_type 指是类型...(base table 指基本,不包含系统) table_name 指具体名 如查询work_ad数据库是否存在包含”user”关键字数据 select table_name from...如何查询包含某字段 select * from systables where tabname like 'saa%' 此法只对Informix数据库有用 查询指定数据库中指定所有字段名column_name

12.4K40

OpenResty + Lua访问Redis,实现高并发访问毫秒级响应打回

配置依赖: 1、OpenRestylua访问redis插件:https://github.com/openresty/lua-resty-redis 下载后,导入对应插件: lua_package_path...lua;;"; lua_need_request_body on; 2、使用lua访问redis: server {         location /test {             content_by_lua_block...,不需要单独封装方法,lua-resty-redis 支持自动生成对应lua方法 具体配置方法是:redis.lua ,common_cmds array,在这里添加需要使用方法 例如:需要使用...前端http查询一些数据,直接在nginx通过lua访问redis拿到,直接返回到前端,减少服务器压力;redis数据通过服务器进行主动更新 (2)点击次数和页面打开次数分析:在点击和页面打开之间...,加上了请求到达nginx统计,当请求到达nginx时,通过lua访问页面次数写入redis,然后通过点击次数、nginx获得请求次数、页面打开次数进行具体业务分析

5.6K30

Lua函数式编程

因为潜意识,foo.lua类似于下面C代码,其中sock变量是与整个C代码生命周期一致。而在C语言中,代码是不会被回收。因此sock是作用域有限全局变量。...sock变量会被GC掉,就要从Lua基本规则说起: 在Lua,一共有8种基本类型: nil、boolean、number、string、function、userdata、 thread 和 table...其中’string,function,userdata,thread,userdata’等需要额外分配内存数据类型均受LuaGC管理。...以往写Lua代码时,我一直以为Lua是“原型对象”编程范式,然而这个“大跟头”让我发现,原来Lua底层基石竟然是“函数式编程”范式(非纯函数式编程语言,Lua函数有副作用)。...在Luarequire和chunk机制我摔跟头充分验证了这一点。

1.2K20
领券