【游戏客户端与服务器面试题干货】– 2022年度最新游戏客户端面试干货(lua篇)
文章目录
- 一、Lua的8种数据类型
-
-
- (1) nil 类型
- (2) boolean类型
- (3) number类型
-
- 1.加+,减-,乘*:
- 2.除/:
- 3.双除法 // :
- 4.取整:
- 5.强制类型转换
- 6.取随机数:
- 7.表示范围
- (4) function类型
-
- 1.多返回值
- 2.可变长参数
- (5) string类型
-
- 1.字符串常量
- 2.长字符串/多行字符串
- 3.类型强制转换
- 4.字符串常用操作
- 5.字符串标准库
- (6) table类型
-
- 1.lua中深拷贝与浅拷贝
- 2.lua中深拷贝与浅拷贝源码
- 3.表索引
- 4.表构造器
- 5.数组,列表和序列
- 6.遍历表
- 7.表标准库
- (7) userdata类型
-
- 1.实例lua调用capi
-
- 1.看两个小栗子
-
- 1.创建lua_Stack
- 2.第一个栗子:c++调用lua的函数
- 3.第二个栗子:lua调用c++的函数
- 1.分析这两个栗子
- (8) thread类型
-
- 1.C/C++与lua的交互方式
- 2.lua_Stack究竟由什么组成
-
- 1.CommonHeader — GC的通用头
- 2. nci — 记录调用栈item个数的变量
- 3.l_G — 全局状态机,维护全局字符串表、内存管理函数、gc等信息
-
- 1.什么是全局状态机global_State
- 2.全局状态机global_State的组成
- 3.全局状态机global_State初始化过程
- 4.StkId — 数据栈:
- 5. CallInfo — 调用栈
- 6. HOOK 相关– 服务于debug模块
-
- 1.首先什么是debug库
- 2.自省(introspective)函数
- 3.introspective自省debug.getinfo函数
- 3.1.栈级别(stack level)
- 3.2.提高调用getInfo的效率
- 4.introspective自省debug.getlocal函数
- 5.Hooks钩子
- 7.GC 垃圾回收
-
- 二、pairs和ipairs的区别
- 三、lua表常用方式(插入,删除,移动,排序)
- 四、如何实现继承关系(__index)
-
-
- 1.面向对象编程–语法糖
- 2.面向对象编程–类的实现与继承
-
- 1.定义一个类:
- 2.继承
- 3.__index元方法
-
- 五、__newindex元方法
-
-
- 1.__nexindex指向一个函数
- 2.__nexindex指向一个表
-
- 六、实现一个常量表
- 七、__call元方法
- 八、__tostring元方法
- 九、lua元方法
-
-
- 1.__index元方法
- 2.__newindex元方法
-
- 1.__nexindex指向一个函数
- 2.__nexindex指向一个表
- 3.__call元方法
- 4.__tostring元方法
- 5.__le,__eq, __lt,__add, __pow,__mod
-
- 十 、lua闭包
-
-
- 1.闭包的概念
- 2.闭包的应用
- 3.闭包的实现原理
-
- 十一、类使用:和.的区别
- 十二、require,loadfile和dofile的区别
- 十三、Lua的热更新原理
-
-
- 1.什么是热更新
- 2.热更新机制应运而生,两种实现方式
-
- 1.简单版但是有缺陷
- 2.复杂版但是很有用
- 2.hotfix 实现了Lua热更新,仅对函数作替换,保留旧数据
- 3.热更新进一步介绍
-
- 1.原理
- 2.要点分析
- 3.Lua热更新的实现
- 4._ENV 环境变量
- 5.上值 upvalue
- 6.热更新函数Lua的require函数
- 7.热更新函数Lua的setenv函数
- 8.热更新函数Lua的debug库函数
- 9.深度递归替换所有的upvalue
- 10.实例分析
- 4.Lua脚本热更新方案
- 5.lua热更新
-
- 1.什么是热更新
- 2.热更新原理第一种:
- 3.热更新原理第二种:
-
- 十四、Lua协同程序
-
-
- 1.lua协同程序初阶
- 2.lua协同程序进阶
-
- 1.什么是协程
- 2.协程&线程的作用
- 3.lua中协程的调用
-
- 1.coroutine.create()创建协程
- 2.coroutine.status()协程状态
- 3.resume和yeild
- 4.通过协程实现异步I/O
-
- 十五、Lua垃圾回收机制
-
-
- 1.mark阶段
- 2.cleaning阶段
- 3.sweep阶段
- 4.finalization析构
- 5.缺陷
-
- 十六、Lua和C相互调用
-
-
- 1.实例lua调用capi
-
- 1.看两个小栗子
-
- 1.创建lua_Stack
- 2.第一个栗子:c++调用lua的函数
- 3.第二个栗子:lua调用c++的函数
- 1.分析这两个栗子
-
- 十七、Lua的一些实例测试
-
-
- (1) 字符串把“abc”,换成“bcd”
- (2) if的使用方法
- (3) 如何对表中元素排序后输出
- (4) 写一个返回多值的函数
- (5) 写一个可变参数得函数
-
- 十八、lua的命名规范以及注释方法
-
-
- 1.lua命名规范
- 2.lua注释方式
-
- 十九、lua条件与循环
-
-
- 1.条件选择语句if
- 2. while循环语句
- 3. repeat..until循环语句
- 4. for循环语句
- 5.提前结束循环
-
- 二十、lua代码优化,别再依赖if..else了
- 二十一、lua数值型for和泛型for
-
-
- 1.数值型for
- 2.泛型for
-
- 二十二、lua模式匹配
-
-
- 1.string.find()
- 2.string.match()
- 3.string.gmatch()
- 4.string.gsub()
-
- 二十三、lua模式匹配练习
- 二十四、lua之数据结构(多维数组,链表,队列)
-
-
- 1.数组
-
- 1.一维数组
- 2.二维数组
- 2.链表
- 3.栈和队列
-
- 二十五、rawset & rawget方法
-
-
- 1.什么是rawset & rawget
-
- 二十六、lua环境ENV
-
-
- 1.全局环境_G
- 2.非全局环境_ENV
-
一、Lua的8种数据类型
在Lua中有8种基本类型,分别是:nil–空,boolean–布尔,number–数值,string–字符串,userdata–用户数据,function–函数,thread–线程(注意这里的线程和操作系统的线程完全不同,lua和c/c++进行交互的lua_Stack就是一种llua的线程类型),和table–表。
我们可以通过调用print(type(变量))来查看变量的数据类型。
(3) number类型
在Lua5.2之前所有的数值都是双精度的浮点型,在Lua5.3之后引入了整形integer。整形的引入是Lua5.3的一个重要标志。
整形与浮点型的区别:
整形:类似1,2,3,4,5…在其身后不带小数和指数。
浮点型:类似1.2,3.5555,4.57e-3…在其身后带小数点或指数符 (e)的数字。
我们使用type(3) 和type(3.5)返回的都是num。
但是如果我们调用math库里面的math.type(3)返回的是integer, math.type(3.5)返回的是float。
对于游戏开发,对num类型的使用无非是以下的状况, Lua语言还提供了除了加减乘除之外,向下取整除法(floor除法),取模和指数运算。
1.加+,减-,乘*:
int对int型进行运算,则得到的结果都是int型,但只要两个数字中有一个是float型,则得出来的结果都是float型。
3.双除法 // :
得到的是一个整值,若结果存在小数,则向负无穷截断。
这是我们类C的写法,function 函数名 小括 参数, 但其实我们还有另外一种写法,把函数当成一个对象去定义:
两种方式都可以声明一个函数,至于使用哪一种方式,就根据贵公司项目而定了。
lua的函数类型除了可以把它当成对象这样定义之外,还有两个特性:可变长参数,以及多返回值。
1.多返回值
- Lua语言中一种与众不同但又非常有用的特性是允许一个函数返回多个结果,只需要在return关键字后列出所有要返回的值即可。
(5) string类型
Lua中的字符串是不可变值(immutable value)。我们不可以像在C语言中那样直接改变某个字符串中的某个字符。但是我们可以创建另外一个新字符串的方式来达到修改的目的。

1.字符串常量
我们可以使用双引 或者单引 来声明字符串常量。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!