使用 closure 替代 table
前几天谈到 lua 的一些技巧,我整理在 wiki 上了。今天又加了一个,关于 point 结构的封装的。
function point (x,y) return function () return x,y end end
可以用 point(1,2) 构造一个 point 。它比 {1,2} 轻量。
还可以有一个更复杂一点的实现:
function point (x,y) return function (idx) if idx=="x" then return x elseif idx=="y" then return y else return x,y end end end
这个技术在 Programming in Lua 中有介绍。
Comments
没有最好的选择,一切看应用。
Posted by: Cloud | (6) November 27, 2007 01:20 PM
我有一个问题。
使用这种技巧模拟的小结构不方便修改,除非在内部函数里面判断更多的分支。
要不然就只有不修改小结构,每次需要修改都创建新 closure 。可是 closure 是要参与垃圾收集的,频繁创建不好吧。
我想知道如果需要用到频繁修改的小结构。是使用 table 更好,还是 closure 更好呢?
Posted by: Atry | (5) November 27, 2007 11:57 AM
"对象是和某些行为(behaviors)相关联的状态数据(state data),而闭包则是和某些状态数据相关联的行为"。
这话是Peter Norvig说的(Design Patterns in Dynamic Programming. http://norvig.com/design-patterns/ppframe.htm ),我鹦鹉学舌一下。
Posted by: soloist | (4) March 20, 2006 11:58 AM
这个不是FPL里面的经典trick么?用function来实现data type。呵呵
Posted by: 刘未鹏 | (3) March 18, 2006 02:30 AM
lua 里 {1,2} 也没有用 hash table ,同样也是一个数组。
不过 closure 对 upvalue 的处理还是比它代价小。
Posted by: Cloud | (2) March 16, 2006 06:39 PM
字符串只应该在需要给人看的地方才使用,给机器看的地方统统用别的办法代替。ActionScript3里面的非dynamic的对象就没有再使用Hash表
Posted by: Atry | (1) March 16, 2006 02:10 PM