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
image
(count在函数执行结束后仍未销毁可下次使用叫做闭包:可以访问外部作用域变量的函数)

递归(函数调用自身)

image

表方法和对象方法

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

image
对象方法写在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(索引赋值)

image
rawset绕过原表新添赋值 rawget绕过原表获取赋值

通过元方法实现算数运算

image
__mod是取余 __concat是a..b表示合并

把table当函数调用

image
如果return table那么这个元表()之后又可以继续调用table的元表 eg:print(user(1)(2)(3)..)

__tostring(从table代码变成直观形式输出)

image
字符串拼接用..

模块

image

加载模块

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包的代理人
image

posted @ 2026-07-08 12:14  yankee_blog  阅读(1)  评论(0)    收藏  举报