Lua 面试题(含详细实战答案)_第1页
Lua 面试题(含详细实战答案)_第2页
Lua 面试题(含详细实战答案)_第3页
Lua 面试题(含详细实战答案)_第4页
Lua 面试题(含详细实战答案)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Lua面试题(含详细实战答案)一、基础语法篇(入门高频)1.Lua有哪些基础数据类型?nil和false的区别是什么?答案:Lua8大基础类型:nil、boolean、number、string、table、function、userdata、thread。nil和false核心区别:nil:空值、未定义值,变量未赋值、访问不存在的表键都会返回nil;nil在条件判断中为假,nil==false结果为false,二者不是同一个值。false:布尔假值,仅true/false是布尔类型。补充:Lua中只有nil、false为假,0、空字符串、空表都是真。2.Lua变量的全局、局部变量区别?推荐怎么用?答案:全局变量:不加local声明,全局环境通用,生命周期贯穿脚本全程。缺点:污染全局环境、变量冲突、查找速度慢、GC无法回收。局部变量(local):仅当前代码块有效,出块销毁,查找速度远快全局,内存可控。工程规范:所有变量默认加local,非必要不定义全局变量。3.Lua字符串和数字的隐式转换规则?会出现什么坑?答案:Lua运算时会自动隐式转换:算术运算:字符串会尝试转数字,比如"10"+5=15拼接运算:数字会自动转字符串,比如10..5="105"常见坑:拼接符号..优先级比加减乘除低,1+2..3结果是"33",不是"123"非数字字符串参与算术运算会直接报错二、Table核心考点(Lua重中之重)4.Luatable的底层结构是什么?数组和哈希部分区别?答案:Luatable是数组+哈希表混合结构,没有纯数组、纯字典之分。数组段:key为连续正整数、从1开始的索引,内存连续、遍历速度快。哈希段:非连续数字、字符串、布尔等非常规key,存在哈希桶中,查找稍慢。实战特点:Lua数组默认从1开始索引,不是0。5.#取表长度的坑有哪些?为什么不建议用#遍历字典表?答案:#table只会读取连续正整数索引的数组段长度,遇到nil中断,不会统计哈希段数据。常见坑:数组中间有nil,长度会截断,比如{1,2,nil,4},#结果是2表中有字符串key、非连续数字key,#完全读不到频繁插入删除会导致数组段断层,长度不稳定规范:数组遍历用ipairs,字典/全量遍历用pairs,永远不要用#判断字典元素个数。6.ipairs和pairs区别?各自适用场景答案:ipairs:只遍历从1开始的连续正整数数组段,遇到nil停止,不遍历哈希key,有序遍历。pairs:遍历table所有key(数组+哈希),遍历顺序无序,能遍历全部数据。场景:纯数组有序遍历:ipairs字典、混合表、统计所有数据:pairs7.Lua如何深拷贝table?直接赋值为什么是浅拷贝?答案:Lua中table是引用类型,变量存的是内存地址,直接赋值只是拷贝地址,两个变量指向同一个表,改一个会影响另一个,这就是浅拷贝。深拷贝思路:递归遍历所有key,新建table,基础值直接赋值,子table递归拷贝,规避循环引用即可。三、函数与闭包(面试高频难点)8.Lua函数的特性?为什么说函数是一等公民?答案:Lua函数是一等公民,和普通变量地位一致:可以赋值给变量可以作为函数参数、返回值可以存进table额外特性:支持多返回值、参数自动补nil、多余参数自动丢弃。9.什么是闭包?Lua闭包的原理和实战用途答案:闭包=函数+外部局部变量的环境快照。Lua中内层函数可以捕获外层的local变量,外层函数执行结束后,外层局部变量本该销毁,但被内层闭包捕获后会被保留存活。实战用途:实现私有变量,避免全局污染回调函数、定时器逻辑封装迭代器封装10.Lua函数多返回值的规则?常见报错场景答案:规则:多返回值默认全部接收,变量少则截断,变量多则补nil函数调用作为另一个函数参数、语句最后时,返回值不截断非末尾位置,只会保留第一个返回值坑:多返回值赋值顺序不对、嵌套调用丢返回值,是新手高频bug。四、元表与元方法(进阶核心)11.什么是元表(metatable)?作用是什么?答案:元表是Lua给普通table附加的行为规则表,可以重写table的运算、访问、赋值、GC行为。普通table本身没有任何运算能力,所有特殊操作都靠元方法实现。核心用途:实现面向对象、表合并运算、只读表、默认值表、GC监听。12.__index、__newindex核心区别和坑点答案:__index:查询兜底。访问表不存在的key时触发,可以是函数或表。存在的key,不会触发。__newindex:赋值兜底。给表不存在的key赋值时触发,用于拦截赋值、做只读校验。高频大坑:__newindex内部给自身赋值会无限递归,需要用rawset绕过元方法赋值。13.rawget、rawset的作用?什么时候必须用?答案:rawget(t,k):绕过__index,直接读取表原始值rawset(t,k,v):绕过__newindex,直接给表赋值使用场景:重写__index、__newindex逻辑时,防止递归死循环,必须用原生读写接口。五、Lua面向对象(面试必问)14.Lua没有class关键字,如何实现面向对象?答案:靠表+元表+__index委托模拟类和对象:父表作为“类”,存放方法新建空表作为“实例对象”实例的元表__index指向类表对象调用方法时,自身没有方法,通过__index找到类的方法self机制:方法第一个参数接收调用者对象,实现实例独立数据。15.Lua如何实现继承?单继承和多继承优缺点答案:单继承:子类元表__index指向父类,简单稳定、性能高,游戏项目99%用单继承。多继承:需要手动遍历多个父类查找方法,实现复杂、容易冲突、查找慢,工程中极少用。六、GC与性能优化(工程实战题)16.Lua的垃圾回收机制?回收哪些对象?答案:Lua采用自动增量标记清除GC,分步回收,不会卡顿。可回收对象:table、function、string、userdata、thread。基础类型nil、number、boolean不占用GC内存,不会被回收。17.Lua常见内存泄漏场景?怎么规避?答案:高频泄漏点:全局表持续累加数据,不清理闭包捕获大对象,变量未释放定时器、回调持有对象引用循环引用table,GC无法快速回收规避:临时变量用局部、不用的数据手动置nil、避免无效引用持有。18.Lua性能优化常用手段答案:优先用local变量,减少全局查找开销循环内不重复创建函数、table少用字符串频繁拼接(字符串不可变,拼接会新建对象)合理复用table,避免频繁新建销毁控制GC触发时机,避免帧内GC卡顿七、易错坑点真题(面试压轴)19.Lua中table循环引用会怎么样?答案:不会内存泄漏,LuaGC可以处理循环引用,只是回收时机变慢,需要等一轮完整GC扫描才能识别无引用的循环结构,频繁大量循环引用会轻微影响性能。20.Lua中..和+的优先级问题,举例说明答案:拼接符..优先级低于算术运算符。示例:print(1+2..3)等价于print(3..3)输出"33"。想要123必须加括号:1..2..3。21.局部变量和全局变量的查找速度差异原因答案:局部变量

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论