Lua 基础知识|特性使用集合

基础知识部分

  • 闭包及其作用,说一些依赖闭包工作的示例,如在回调函数及沙箱环境中的使用;

  • 举例说明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的必须是数组类型而不是链表类型。

猜你喜欢

转载自blog.csdn.net/XIANG__jiangsu/article/details/78600552