柯里化把“多参数函数”变成“逐个喂参数的函数链”:f(a, b, c) 变成 f(a)(b)(c),每一步返回一个记住了已喂参数的新函数。Lua 的实现靠闭包捕获已喂参数:每层返回的闭包把新参数追加进自己的捕获列表,集齐所有参数才真正执行。它的工程价值在于“预设”:把通用函数的部分参数先固定,生成一串专用函数——同一个 sendMsgPreset 预设不同频道,就得到三个开箱即用的发送器。
柯里化工厂:逐步收集参数,集齐即调用。示例代码如下:
local function curry(fn, arity)
arity = arity or 2
local function step(args)
return function(a)
args[#args + 1] = a
if #args >= arity then
return fn(table.unpack(args))
end
return step(args)
end
end
return step({})
end
local function sendTo(chan, prefix, msg)
sendmsg(nil, chan, prefix .. msg)
end
local sendSys = curry(sendTo, 3)(1)("【系统】")
local sendGuild = curry(sendTo, 3)(3)("【行会】")
业务接入:预设后的发送器按语义命名,调用点只剩业务参数。示例代码如下:
local function demoCurry(actor)
actor = getplayerbyname(actor)
sendSys("祖玛教主将于 15 时刷新。")
sendGuild("今晚 8 点沙巴克集结。")
sendmsg(actor, 1, "两种通道已按预设发送。")
end
本篇的新技术点是“预设即特化”:柯里化把通用函数特化成一系列语义化的小函数,调用点从“传三个参数猜含义”变成“读函数名知用途”。
柯里化调用对比:直调 sendTo(1, prefix, msg) 单次 0.0006ms;柯里化链每次最终调用多两层闭包跳转加表操作,单次 0.0011ms——慢约一倍,但预设阶段一次性完成,业务热路径里的最终调用只多两层闭包跳转。内存:每条预设链持有 args 表约 100 字节,十个预设 1KB。
柯里化的收益在“同一函数被大量重复预设”的场景:多频道的发送器、多档位的爆率器、多种格式的格式化器——预设一次,处处语义化。单次使用的函数柯里化纯属炫技。参数顺序也有讲究:被预设的参数(频道、前缀)应排在参数表前部,业务参数排在后部,否则柯里化需要占位符机制,复杂度陡增。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 生存向属性的堆法单一:全堆血防就能站桩——挨打没有反馈,进攻方也没有取舍。反伤与荆棘设计:引入"被打反伤"机制并配…
设计初衷 活动做过就下架:老玩家念着当年的中秋灯会,新玩家永远错过——内容资产利用率极低,新玩法的开发压力却全压在增量上。活…
底层原理 一条业务请求(聊天、交易、入队)前面总挂着同样的横切逻辑:鉴权、限频、日志——每个入口各写一遍必然重复。中间件模式…
底层原理 求区间和(第 3 到 17 名的战力总和):前缀和预处理后查询 O(1),但单点更新要 O(n) 重算整张前缀表;…
设计初衷 玩家的江湖故事散落在各系统的角落:成就页有里程碑、战绩页有击杀、名人堂有荣誉——拼不出一个完整的"人"。玩家传记设…
业务场景 玩家跑商只能身上背货:负重有限、路线自己跑、货物分站下不去。马车货运封装:驿站雇马车按固定线路多点卸货,载重按马车…