【语法算法】
闭包工厂的本质就这一行:
local function factory(config)
return function(input) return process(input, config) end
end
外层函数接收配置,返回一个闭包——闭包捕获配置,后续调用使用捕获的配置——闭包工厂的全部机制就这一行。可这一行的妙处在于:同一个工厂可以生产出配置不同的闭包——每个闭包记住自己的配置——互不干扰。今天拆开。
一、配置、生产、使用三段
闭包工厂的三段。配置:工厂函数接收配置参数——配置被闭包捕获成为 upvalue——upvalue 的生命周期和闭包一样长。生产:工厂返回一个闭包——闭包内部引用了配置——后续调用闭包时使用捕获的配置——配置在闭包创建时就固定了。使用:调用闭包时使用捕获的配置——不同配置的闭包行为不同——同一配置的闭包行为一致——闭包的一致性就是工厂的产出质量。三段连起来:闭包工厂玩的是"配置的固化和复用"——配置在生产时固化,使用时不变——固化的配置就是闭包的"出厂设置"。
graph TD
A["factory(config)"] --> B["返回闭包"]
B --> C["闭包捕获config"]
C --> D["config成为upvalue"]
D --> E["后续调用使用config"]
A --> F["factory(config2)"]
F --> G["返回新闭包"]
G --> H["捕获config2"]
E --> I["config和config2互不干扰"]
H --> I
二、闭包工厂的正确写法
local function createMultiplier(factor)
return function(x)
return x * factor
end
end
local double = createMultiplier(2)
local triple = createMultiplier(3)
print(double(5)) -- 10
print(triple(5)) -- 15
print(double(10)) -- 20
double 和 triple 是两个独立的闭包——各自捕获了自己的 factor——互不干扰——闭包工厂的独立性就是它的核心价值。
三、捕获的时机与工厂的分层
捕获的时机在闭包创建的那一帧——upvalue 的值在这一刻被绑定——之后修改外层变量不会影响已捕获的值——upvalue 是"创建时的快照"而不是"实时引用"——除非闭包捕获的是表——表的修改会反映到闭包里。工厂的分层也是闭包工厂的进阶玩法:工厂可以返回工厂——createValidator 返回一个验证器工厂,验证器工厂再返回具体的验证函数——多层工厂构成验证器家族——每层的配置逐层传递逐层收窄。最后一条纪律:闭包工厂不要有副作用——工厂只做配置捕获和闭包返回——不做 IO、不发网络请求——工厂的纯函数性决定了产出的闭包的可靠性。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 上一版藏了条只在长战斗里露头的隐蔽报错:吞劲的计数器跨场不清零——第一场怪喂满了五拳把它噎住,第二场新怪刚出手…
【游戏功能】 再抛一个坑:血条的长短是天生的吗?一只怪的命根子一千点,打完就满,下回见面还是一千点——命根是它自己的,跟你的…
【游戏功能】 var over=d-before ——先拆这一行。刀额减去落刀前的血,多出来的那一截就是杀过头的余劲。顺劈纹…
【游戏功能】 上一轮的线上事故出得难看:有玩家押了二十滴血没在限期内斩掉怪,注被纹收走了,直接在频道里喊"强买强卖"。复盘下…
【游戏功能】 上一版留了个查了半天的隐蔽报错:战斗统计里玩家的出招间隔写着一秒四,实际手感却是一秒整——两套计时账对不上,运…
【游戏功能】 先抛一个坑:你砍出去的最强一刀,去哪了?暴击三千的天胡刀,数字蹦完就散,下一刀又是从零起算——最强的那一击在战…