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

Lua学习笔记

当访问table中不存在的字段时,得到的结果为nil。如果我们为该table定义了元方法__index,那个访问的结果将由该方法决定。...需要说明的是,C函数无法直接将真正的返回值返回给Lua代码,而是通过虚拟栈来传递Lua代码和C函数之间的调用参数和返回值的。...]-- --19.编写C函数的技巧-- --[[ 在Lua中,“数组”只是table的一个别名,是指以一种特殊的方法来使用table。...由于这两个函数均为原始操作,比涉及元表的table访问更快。通常而言,作为数组使用的table很少会用到元表。...full userdata和light userdata之间最大的区别来自于相等性判断,对于一个full userdata,它只是与自身相等,而light userdata则表示为一个C指针,因此,它与所有表示同一指针的

3.7K60

【Lua菜鸟②】数据类型

Lua的nil,boolean和string类似java中的null,boolean,String number类似c中的double userdata可以自己用来实现自己的数据类型,比如链表,栈,队列和堆...table Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。...不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。 ?...线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。...userdata(自定义类型) userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和

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

    Lua基础教程1(长文预警)

    return then true until while 基础数据类型 nil、boolean、number、string、userdata、function、thread和table 检测类型 最后一个输出结果...print(#"123") table Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。...tb) -- 2 print(tb[20]) -- 20 注意看上面dictionary表中索引如果中断,是无法正确获取table长度的。...userdata userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到...ulua就是通过扩展userdata来实现调用unity3d的各种属性。 变量作用域 Lua 变量有三种类型:全局变量、局部变量、表中的域。

    42310

    Lua与C语言接口编程实战指南:打造高性能、灵活的程序

    一、前言Lua/c接口编程是skynet的核心技能开发,主要涉及到Lua调C语言和C语言调用Lua的工作流程。从而开发属于自己的组件。Lua/c接口编程主要掌握Lua和C语言之间它们是怎么交互的。...openresty(nginx + lua):openresty使用多进程,每个进程都有自己的lua虚拟机。skynet中调用层次:skynet是多线程的,actor的调度和执行由线程池分配。...对lua不熟悉可以查看Lua参考手册查看接口函数,里面都提供了c语言的api和lua的api。四、c语言调用lua的函数c代码只需要编译一次,lua可以随时改动;因为lua是动态语言。...0); // 调用方法 } int main(int argc,char **argv) { lua_State *L=luaL_newstate(); //创建lua虚拟机...数据(包括 userdata 和lightuserdata )。

    44410

    c++反射深入浅出 - 4.基于反射的Lua中间层实现

    . 1.2 属性的处理 这部分的实现基本都严重依赖下一节中c++对象到userdata的包装, 核心功能是依托于自定义的meta get/set方法, 完成对userdata中对应C++对象某成员变量的获取.... 1.3 c++对象-> userdata 这部分更多的是作为一个对象容器载体, 然后通过meta table来方便lua访问这个载体, 主要提供函数获取, 属性获取等功能, 基本上每个bridge...lura的bridge实现机制. 3.1.1 提供静态类成员访问功能的meta table class table提供了两个元方法: 1....__gc 等元方法, 这样在我们对类对象进行函数调用或者成员变量访问的时候, 都能够正确的触发相关的逻辑, 再利用前面介绍到的up value, 每次调用都能很好的访问到相关的对象. void LuaCFunctions...对象创建的时候已经正确关联meta table了, 运行时不需要额外的操作, 我们就能依赖关联的meta table和meta method来完成在lua中调用c++函数和访问c++成员变量的功能了.

    1.5K10

    C++反射:全方位解读Lura库的前世今生!

    (二)属性的处理 这部分的实现基本都严重依赖下一节中c++对象到userdata的包装,核心功能是依托于自定义的meta get/set方法,完成对userdata中对应C++对象某成员变量的获取。...(三)c++对象->userdata 这部分更多的是作为一个对象容器载体,然后通过meta table来方便lua访问这个载体,主要提供函数获取,属性获取等功能,基本上每个bridge库都会有自己的实现...提供静态类成员访问功能的meta table class table提供了两个元方法: __index __call __index用于完成对类的静态函数和静态变量进行访问,我们可以从上图中看到该功能实现被关联到了...提供实例成员访问的meta table 如上图所示,对于每个C++对象,挂接的meta table就包含了: __index __newindex __gc 等元方法,这样在我们对类对象进行函数调用或者成员变量访问的时候...对象创建的时候已经正确关联meta table了,运行时不需要额外的操作,我们就能依赖关联的meta table和meta method来完成在lua中调用c++函数和访问c++成员变量的功能了。

    2K20

    c++反射深入浅出 - 基于反射的Lua中间层实现

    . 1.2 属性的处理 这部分的实现基本都严重依赖下一节中c++对象到userdata的包装, 核心功能是依托于自定义的meta get/set方法, 完成对userdata中对应C++对象某成员变量的获取.... 1.3 c++对象-> userdata 这部分更多的是作为一个对象容器载体, 然后通过meta table来方便lua访问这个载体, 主要提供函数获取, 属性获取等功能, 基本上每个bridge...lura的bridge实现机制. 3.1.1 提供静态类成员访问功能的meta table class table提供了两个元方法: 1....__gc 等元方法, 这样在我们对类对象进行函数调用或者成员变量访问的时候, 都能够正确的触发相关的逻辑, 再利用前面介绍到的up value, 每次调用都能很好的访问到相关的对象. void LuaCFunctions...对象创建的时候已经正确关联meta table了, 运行时不需要额外的操作, 我们就能依赖关联的meta table和meta method来完成在lua中调用c++函数和访问c++成员变量的功能了.

    1.3K20

    Lua语法讲解

    所以Lua不适合作为开发独⽴应⽤程序的语⾔。Lua 有⼀个同时进⾏的JIT项⽬,提供在特定平台上的即时编译功能。...它可以实现数组,哈希表,集合,对象; 语⾔内置模式匹配;闭包(closure);函数也可以看做⼀个值;提供多线程(协同进程,并⾮操作系统所⽀持的线程)⽀持; 通过闭包和table可以很⽅便地⽀持⾯向对象编程所需要的...lua有交互式编程和脚本式编程。...Lua中有8种基本类型,分别为:nil、boolean、number、string、userdata、function、thread、table。...表示执⾏的独⽴线路,⽤于执⾏协同程序 table Lua 中的表(table)其实是⼀个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。

    51860

    Lua数据的内存结构

    :对比ue4是使用一个全局Object数组实现的,Lua每个节点就浪费掉8字节) tt是当前对象的类型,和上面的tt_是一样的 marked是给垃圾回收器用的标记位 因此,GC对象至少会占用10字节的头部内存...Lua的Table分为两部分,一个数组段和一个Map段 flags:一些标记位 lsizenode:Map的长度 sizearray:数组的长度 array:数组第一个元素的指针 node:Map...: Table中Map的一个KV元素的结构: Table的实际大小,可以参考Lua垃圾回收时候遍历Table的代码: Userdata Proto Proto就是Lua的函数原型,Lua函数的字节码都保存在这里...,调用函数的地方只需要通过指向Proto的指针调用执行,具体结构很复杂就不细说了,可以看下图 内存占用: 闭包 分为C函数闭包和Lua闭包 C函数闭包:C的函数指针+UpValue数组 Lua...对象列表,按上面规则逐一统计,这里简单贴一个UE4+Unlua的内存详细统计并打印到log中的控制台命令,整个统计方法就是根据上面实现的。

    2.4K50

    Lua 性能剖析

    是空类型,表示什么都不是, number在内部实现中区分为整形和浮点型, function有三个子类: C Function, Lua Function和light C Function userdata...有两个子类:userdata和light userdata thread就是lua中的协程 table是lua中唯一的聚合类型,不像c++的STL那样,拥有vector、map、set等多种容器,在...在Lua 4.0之前,Table是严格的按照Hash的方式实现的,后续版本为了提升性能和节省空间, Table内部重构为数组部分和Hash部分两块。...Hash部分的查找需要经过hash运算和 TValue判等运算,对于lua_number和table/function/userdata, 这都不是问题。对于string,lua做了一点优化。...数据栈是C数组,会动态的增长和回收,不够的时候就realloc, 把栈空间扩大一倍。 Lua函数调用会触发数据栈栈顶的增长和CallInfo增加新节点, 函数return的时候执行相反的操作。

    16.1K80

    关于UnLua的改进与替换方案

    3、UObject 属性访问Crash:这个就比较容易理解了,UObject释放时,Unlua没有这个数据追踪系统,无法正确识别,特别是引用TArray, TSet这些属性时。...6、常出现脚本无法绑定(现在还没有彻底解决)7、UFunction 的问题,UFunction由于在Lua中引用了,常导致UObject指针无效,或无法GC的问题问题的根源我觉得这个根源来自于设计思想吧...改进方案Lua中所有访问到的UE对象,都使用一个对象管理器来管理,Lua 的UserData不再记录一个原始C++对象指针,而是记录一个对象ID,所有获取参数的地方都要通过管理器来获取。...在新方案中,对比测试读写蓝图的属性(int, FString, Vector三个),读写均比UnLua快10倍以上TArray的Get, Set方法,也比UnLua快了一倍当然,其他的我还没有对比测试,...这里补充一下两个方案的属性查询流程图, 新方案快,是因为在绑定脚本里面直接返回属性对应的lua对象UnLua是不管什么对象,都会返回一个UserData, 再通过Global_Index触发UserData

    2.8K30

    掌握Lua的基本数据类型:入门必备基础

    userdata 类型允许把任意的 语言数据保存在 Lua 语言变量中 Lua 语言中,用户数据类型除了赋值和相等性测试外,没有其他预定义的操作 用户数据被用来表示由应用或语言编写的库所创建的新类型。...由于整型值和浮点型值 类型都是 number ,所以它 是可以相互转换的。同时 ,具有相算术值的整型值 和点型值在lua语言中是相等的。...语言中最主要和强大的数据结构 使用表, Lua语言可以以一种简单、统一且高效的方式表示数组、集合、记录和其他很多数据结构。...Lua语言也使用表来表示包( package )和其他对象。Lua 言中的表本质上是一种辅助数组,这种数组不仅可以使用数值作为索引,由可以使用字符串或其他任意类型的值作为索引( nil 除外)。...注意:userdata 指向的内存需要由 lua 创建,同时 userdata 的销毁也交由 lua gc 来自动回收。2.8、lightuserdatalightuserdata是轻量用户数据。

    47910

    Redis Lua脚本中学教程(下)

    局部变量可以避免增加不必要的名称来混淆全局环境,同时也能避免两部分代码的命名冲突。另外,访问局部变量要比访问全局变量的速度更快。 局部变量的使用范围是有限制的,只在它声明的块中可用。...数据类型 Lua是一种动态类型语言,它有8种基本类型:nil,Boolean,number,string,userdata,function,thread和table。...画外音:Lua把0和空字符串也判断为真,这点感觉设计的不太好啊 and、or和not是Lua的逻辑运算符。 and的运算方法是,判断第一个操作数是不是false,如果不是,结果就是第二个操作数。...它可以用来表现很多种数据类型,如数组、集合、记录等。 每个表的key可以是不同类型的,对于未定义索引的表元素,它的默认值是nil。和其他大部分语言不同的是Lua中表的下标是从1开始的。...Lua还提供了一种特殊的函数访问方法,有兴趣的话可以参考https://www.lua.org/pil/16.html o:foo(x) Lua程序中既可以使用定义在Lua中的函数,也可以使用定义在C

    1.2K10

    每周一总结 总结(2) redis lua相关

    Lua将简单的过程语法和 基于关联数组和可扩展语义的强大数据描述相结合。是一种动态类型化的语言。...线程跟协程的区别:可以同时有多个线程运行、但是同时只能有一个协程运行。处于运行状态的协程只有被挂起时才会暂停。 数组默认起始索引是1,可以从负值开始 4. lua变量:全局变量、局部变量、表中的域。...尽可能使用局部变量,可以避免命名冲突,同时也是由于访问局部变量的速度比访问全局变量的速度快。...redis call 和pcall lua脚本中获取redis的数据或者执行redis的方法,call 和pcall -- 自己代码中遇到的几个例子 -- 判断是否存在keys[1],调用了redis...pipeline是一次性执行多条指令,一次网络开销 事务是N次网络开销执行N次指令 pipeline和事务中的后置的指令都无法获取到前置指令的结果。

    81410

    Lua05——Lua基本数据类型

    字符串,可由一对单引号或双引号表示 userdata 表示任意存储在变量中的 C 数据结构 function 由C 或 lua 编写的函数 thread 表示执行的独立线程,用于执行协同程序 table...lua中的表,其实是一个关联数组,数组的索引可以是数字、字符串或表类型。...true true 2.3 number lua 中没有区分整数和小数,所有数字统一为number类型,即实数。...线程与协程的区别: 线程可以同时多个运行,协程在任意时刻只能运行一个,且处于运行状态的协程只有被挂起时,才会暂停。...2.8 userdata(用户自定义类型) 一种由用户自定义的数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意C/C++ 的任意数据类型的数据存储到 lua 变量中调用。

    1K20

    Lua 基础

    Lua 数据类型 Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。...使用 # 来计算字符串的长度 在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字 function 由 C 或 Lua 编写的函数 userdata 表示任意存储在变量中的...赋值语句 --赋值是改变一个变量的值和改变表域的最基本的方法。 a = "hello" ....."world" t.n = t.n + 1 --Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。...Lua 数组 Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。 可以使用整数索引来访问数组元素,如果指定的索引没有值则返回nil。

    2.8K00
    领券