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

下载本文档

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

文档简介

Lua面试题(含真实接地气答案)说明:整套题目适配游戏开发、Lua后台、OpenResty岗位,无书面化空话,答案贴合日常开发,为行业真实面试高频考点。一、基础语法篇(入门必考)1、Lua有哪些基础数据类型?nil和false的区别是什么?答案:Lua基础类型:nil、boolean、number、string、table、function、userdata、thread。核心区别:1.nil代表「空、不存在」,全局变量未赋值、访问table不存在的key,结果都是nil;nil会直接释放变量占用的内存。2.false是布尔假值,只是逻辑判断为假,变量本身是存在、有定义的。补充:Lua中只有nil和false为假,0、空字符串、空table全部为真。2、Lua中#取长度的坑有哪些?答案:#只对连续数字索引、从1开始的数组部分生效,坑点非常多:1.数组中间有断层,#会截断,只统计断层前的长度;2.table包含字符串key、自定义key时,#完全不统计;3.数组从0/非1数字开始索引,#结果不准;4.空table#返回0,正常连续数组可正常取值。实战建议:纯数组用#,混合table遍历必须用pairs。3、local全局变量和局部变量的区别?开发中为什么优先用local?答案:1.全局变量:默认不带local,全局环境_G下的变量,整个脚本、所有函数都能访问,生命周期贯穿脚本全程。2.局部变量:带local关键字,只在当前代码块、函数、循环内生效,代码块结束立即失效。优先用local的原因:-访问速度更快:Lua局部变量存在寄存器,全局变量需要查表_G;-避免全局污染,防止变量重名覆盖、莫名报错;-内存回收更快,不会常驻内存。4、Lua的字符串是可变的吗?字符串拼接有什么性能问题?答案:Lua字符串不可变,一旦创建不能修改,任何拼接、替换都会生成新字符串。性能坑:频繁用..拼接长字符串,会不断创建销毁对象,产生大量内存碎片,效率极低。实战解决方案:多字符串拼接用table.concat,先存入table最后一次性拼接,性能提升几十倍。二、核心进阶篇(面试重点)1、pairs和ipairs的区别?各自适用场景?答案:ipairs:只遍历从1开始、连续数字索引的数组,遇到nil直接终止,不遍历字符串key、自定义key。pairs:遍历table所有key(数字、字符串、自定义key),会遍历全部键值对,无序遍历。使用场景:-纯有序数组遍历、需要按序号遍历→ipairs;-哈希表、混合table、不确定key类型→pairs。2、Lua元表(metatable)是什么?常用元方法有哪些?答案:元表是给普通table加的一套「行为规则」,可以重写table的默认操作,类似面向对象的重载、运算符重载。常用核心元方法:-__index:访问table不存在的key时触发,用于查表、实现继承;-__newindex:给table不存在的key赋值时触发,可做只读table、数据拦截;-__add/__sub/__mul:加减乘运算符重载;-__tostring:打印table时自定义输出格式;-__call:把table当函数调用时触发。3、__index是函数和table的两种用法,分别是什么场景?答案:1.__index设为table:访问不到key时,自动去这个table里查找,适合做继承、默认配置;2.__index设为函数:访问不到key时触发回调函数,可自定义返回逻辑、做日志拦截、动态生成数据。实战:静态默认值用table,动态逻辑、拦截逻辑用函数。4、Lua怎么实现面向对象?原理是什么?答案:Lua本身没有类,完全靠元表+__index模拟面向对象。核心原理:1.定义一个「类表」,存放所有成员方法;2.新建实例空table,将实例的元表__index指向类表;3.实例访问不存在的方法/属性时,会通过__index找到类表,实现复用;4.继承就是子类的__index指向父类,层层向上查找。5、Lua闭包是什么?有什么特性和使用场景?答案:闭包就是内嵌函数+对外层局部变量的捕获。核心特性:外层函数执行结束后,内层闭包依然可以持有、使用外层的局部变量,变量不会被销毁。实战场景:-封装私有变量,避免全局暴露;-定时器、回调函数保存上下文;-生成批量独立逻辑函数。6、Lua垃圾回收机制了解吗?什么时候会内存泄漏?答案:Lua是自动GC,采用标记清扫机制,自动回收无引用的table、字符串、函数等对象。常见内存泄漏场景(面试高频):1.全局table持续累加数据,只增不减,永远有引用;2.闭包长期捕获大变量、全局回调持有对象引用;3.定时器、事件监听注册后不注销,持续持有实例;4.循环引用(两个table互相引用),旧版Lua无法回收,新版已优化但仍有残留问题。三、实操坑点篇(工作必考)1、Lua中nil赋值给table的key有什么作用?答案:给table某个key赋值nil,直接删除该键值对,不是赋值为空。实战坑点:数组删除中间元素后,会产生索引断层,#长度统计失效,需要手动处理数组排序、补位。2、locala,b=1,nil这种赋值会发生什么?答案:Lua多值赋值规则:变量多、值少,多余变量补nil。此行代码执行后:a=1,b=nil。反向:值多变量少,多余的值直接丢弃。3、Lua迭代过程中,能不能直接删除/新增table元素?有什么问题?答案:1.ipairs遍历中新增、删除元素,会直接打乱遍历索引,漏遍历、报错;2.pairs遍历中删除元素大概率没问题,但新增元素可能被遍历到也可能不遍历,逻辑不可控。实战标准写法:遍历前先把需要操作的key存到临时table,遍历结束后再统一增删改。4、require加载文件的机制?为什么重复require不会重复执行?答案:1.require会先查询package.loaded表;2.如果文件已加载,直接返回package.loaded中的缓存结果,不再执行脚本;3.首次加载会执行脚本,并将返回值存入package.loaded缓存。清空缓存可强制重加载:package.loaded["模块名"]=nil。四、手写代码题(面试手撕)1、手写一个Lua简单类、实现继承和创建实例答案(可直接运行):lua

--父类

localPerson={}

Person.__index=Person

functionPerson:new()

localobj={}

setmetatable(obj,Person)

returnobj

end

functionPerson:say()

print("我是父类")

end

--子类继承

localStudent={}

Student.__index=Student

setmetatable(Student,Person)--继承父类

functionStudent:new()

localobj=Person:new()

setmetatable(obj,Student)

returnobj

end

functionStudent:say()

print("我是子类学生")

end

--测试

locals=Student:new()

s:say()

2、手写table深度拷贝函数答案(实战通用版):lua

localfunctiondeepCopy(tbl)

localres={}

fork,vinpairs(tbl)do

iftype(v)=="table"then

res[k]=deepCopy(v)

else

res[k]=v

end

end

returnre

温馨提示

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

评论

0/150

提交评论