1.写lua代码时需要注意什么?如何避免
- #table 可以用来获取表的长度,但table中包含nil时,不能使用。
- table.sort()排序时,table必须是连贯的,中间不能有nil。
- 尽量使用局部变量,局部变量的存取会更快,且生命周期外就会被释放。
- 使用iparis时,table的key必须是连续的。
- next函数常用来进行无序遍历整张表
- 调用库函数,如果很频繁,如string.formate("%s",str),math.abs 可以考虑函数局部化,能显著提高性能。
- 全局变量不需要声明,如果要删除一个全局变量,只需为其赋值nil
- lua中出了nil和false表示为假,其余值都表示为真(0,空串{})
- {} 和 nil 表示不一样,{}表示表没有数据,nil表示不存在。
- nil只能和自己相等。
- 逻辑运算:A and B A为假返回a,否则返回b。A or B A为真返回A,否则返回B.
- 不推荐数组下标为0开始。
- lua 两个table之间不能直接相互运算,可以用元表为其中的table赋予属性。
2.Lua内存泄漏是什么?如何处理?
- lua中有垃圾回收机制,理论上不会有内存泄漏。
- 内存泄漏指:已经没有被使用了,但外部依然还有引用存在的对象。
--函数中应该被申明为local的对象忘记加local local function test() testTable = {} --这个testTabel会被存放在全局表_G中,GC时由于此对象还有引用存在,所以这里总是会有一个table泄露。 local mt = {} --mt加了local修饰,函数调用完后,引用也不复存在了,GC时会被回收。 setmetatable(testTable, mt) end
当它进行GC的时候,会从根部开始扫描所有的对象,如果某个地方对这个对象还有引用,就不会把这个对象内存collect,这个对象就没有被GC。
-
编写代码去检测喽。
3.Lua中变量类型有哪些?8个
- number:实数
- string:字符串
- boolean:真假
- nil:空
- table:表
- function:函数
- userdata:数据类 tonumber(tostring(userdata))
- thread:线程