lua语言理论及应用
Lua语言技术(其二)
函数的高级用法
函数作为值
function add(a,b)
return a+b
end
local add1=add
作为元素
local array={1,2,3,add}
print(array4)
local info{
fuc=add
}
print(info.fuc(a:3,b:4))
作为参数
function fuc2(fuc1)
fuc1()
end

(count在函数执行结束后仍未销毁可下次使用叫做闭包:可以访问外部作用域变量的函数)
递归(函数调用自身)

表方法和对象方法
| 表方法 | 对象方法 |
|---|---|
| 方法中未用到对象自己 | 方法中用到了对象自己 |

对象方法写在table内需要显式(self)
元表(等同于父类,实现继承)
__index(索引查找)
查找table的键(原表不存在的)
info{name="wu"}
obj={name="virtual",money=1000}
obj_parent{home="房子"}
info1=setmetatable(info,{__index=obj})
setmetatable(obj,{__index=obj_parent})
print(info==info1)--true
print(info.name)--wu
print(info.money)--1000
print(info.home)--房子
查找函数
setmetatable(
user,
{
__index=function(table,key)
print(user.name,key)
end
}
)
__newindex(索引赋值)

rawset绕过原表新添赋值 rawget绕过原表获取赋值
通过元方法实现算数运算

__mod是取余 __concat是a..b表示合并
把table当函数调用

如果return table那么这个元表()之后又可以继续调用table的元表 eg:print(user(1)(2)(3)..)
__tostring(从table代码变成直观形式输出)

字符串拼接用..
模块

加载模块
local news=require("xxx")--xxx.lua而来
路径较深括号内写(A.B)
查找路径详细
当前模块加载另一个模块会在当前模块的目录为起点(不用写出)将内部的所有.lua看作A
默认路径packagepath是当前目录+电脑下载lua目录所有文件,里面所有文件可直接看作A加载
若文件不在默认路径下要修改package.path
eg:package.path=package.path..";/lib/?.lua"
包的管理
当模块数量过多,需按功能组织成包,核心是通过init.lua实现包作为模块
init.lua下面的所有模块通过init.lua去require获取,是整个utils包的代理人
