基础知识部分
-
闭包及其作用,说一些依赖闭包工作的示例,如在回调函数及沙箱环境中的使用;
-
举例说明lua正确处理尾调用的优势(无限制的递归层次)
尾调用结束后程序不需要返回至调用者,尾调用函数无需知道调用者相关信息,因此尾调用无需开辟栈空间。 -
lua多状态迭代器的使用(多状态作为参数传入迭代器中)
-
require与dofile的差异(支持路径模式|避免重复加载同一个文件(如何实现的?))
-
协同程序的使用
-
lua如何使用C包(loadlib 返回包的初始化函数)
-
元表的作用(算数运算、关系运算、库定义的元方法、表相关的元方法)
__index、__newindex 、__call(表调用值时调用)、__tostring() -
实现面向对象中的类、继承(多重继承)、私有性、单例模式。
-
模式匹配的使用
lua使用中可能遇到的问题合集
1. table.sort
下面是两个错误排序函数:
local t = {
[1] = {id=1,name="1"},
[2] = {id=2,name="2"},
[3] = {id=4,name="3"},
[4] = {id=4,name="4"},
[5] = {id=4,name="5"},
}
local sortFunc = function(a,b)
if a.id < b.id then
return true
elseif a.id == b.id then
return true
else
return false
end
end
table.sort(t,sortFunc)
以上代码运行报错,提示排序函数无效或是 attempt to index local ‘a’ ,原因是:
当比较函数没有写的时候,table.sort默认按照lua里面的排序规则升序排序;当重写了比较函数时,比较函数重载了lua中自带的“<”比较操作符。当a=t[3],b=t[4]时,a < b,当b=t[3],a=t[4]时,b < a,两者矛盾,会出错。修正方法:当比较的值相等时总是返回false。
另一个需要注意的问题是待排序table的类型,如下:
local t = {
[1] = {id=100,name="1"},
[2] = {id=20,name="2"},
[3] = {id=4,name="3"},
[40] = {id=4,name="4"},
[5] = {id=4,name="5"},
}
local sortFunc = function(a,b)
if a.id < b.id then
return true
else
return false
end
end
table.sort(t,sortFunc)
for k,v in pairs(t) do
print("id:",v.id)
end
id: 20
id: 100
id: 4
id: 4
id: 4
结果基本是乱的,所以排序方法另一个需要注意的是:排序的目标table的必须是数组类型而不是链表类型。