在 lua 中实现函数的重载
警告:记录以下内容纯粹自娱,请勿轻易用于项目。我个人也不赞同随意使用语法糖去改造语言。
我们知道 C++ 里有函数重载的特性,程序员可以为一个看起来同名的函数做多份实现,让编译器通过调用时的参数类型去指定链接器链接最为匹配的一份实现。对于死忠的 C++ 程序员,这绝对是最必不可少的利器。如果没有它,那些 template 绝对玩不出现在这么多花来,当然也就没那么多机会拿着“充满智慧” 花哨的 template 代码来 YY 自己的智商了。
哦,写 lua 的所谓脚本程序员不要沮丧,其实 lua 中可玩的花样也很多。一样可以写出让同行瞠目结舌的代码来。比如这个函数重载的问题,虽然 lua 不可能做所谓编译期运算(动态生成代码或许勉强算一个),也没有什么静态链接过程。
但 lua 是个有趣的语言,下面看我怎么模拟出一个类似的东西来。
我们的目标大约是这样的:
define.test { "number", function(n) print("number",n) end } define.test { "string", "number", function(s,n) print("string number",s,n) end } define.test { "number", "...", function(n,...) print("number ...",n,...) end } define.test { "...", function(...) print("default",...) end }
然后调用 test 的时候,可以通过调用参数,分发到不同的函数实现上去。当然,需要找到最接近的匹配。
test(1) test("hello",2) test("hello","world") test(1,"hello") 将输出 number 1 string number hello 2 default hello world number ... 1 hello
这件事情其实很容易做,只需要额外为每个需要用多态函数的环境记录一张表。里面放上同名函数的分发器。而分发器按事先注册的参数表去检查匹配参数,找到最合适的对应函数定义。
如果得不到任何匹配就抛出异常,这样也可以在需要强类型检查时增强一些安全性。
不过这些事情当然会有性能上的开销,也就是代价吧。既然是玩具代码,我也没太优化,纯粹是过节自娱。
大家节日快乐。
附上代码: LuaFunctionOverload
ps. 如果在定义函数的地方,定义参数默认值也很容易,这里就不给出代码了。
Comments
Posted by: TD | (14) May 11, 2009 12:30 PM
Posted by: windmeup | (13) May 10, 2009 09:13 PM
Posted by: Jerry | (12) May 6, 2009 11:34 AM
Posted by: archerk | (11) May 4, 2009 03:41 PM
Posted by: black | (10) May 3, 2009 07:54 PM
Posted by: chentan | (9) May 3, 2009 03:54 PM
Posted by: lv | (8) May 3, 2009 03:42 PM
Posted by: chinainvent | (7) May 3, 2009 12:44 AM
Posted by: sjinny | (6) May 2, 2009 02:23 PM
Posted by: atyuwen | (5) May 2, 2009 11:35 AM
Posted by: 废材 | (4) May 2, 2009 01:14 AM
Posted by: mm | (3) May 2, 2009 01:07 AM
Posted by: NeverRain | (2) May 1, 2009 11:03 PM
Posted by: yuki | (1) May 1, 2009 06:47 PM