« 监视单件的调用 | 返回首页 | 资源的管理及加解锁 »

使用 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

没有最好的选择,一切看应用。

我有一个问题。

使用这种技巧模拟的小结构不方便修改,除非在内部函数里面判断更多的分支。

要不然就只有不修改小结构,每次需要修改都创建新 closure 。可是 closure 是要参与垃圾收集的,频繁创建不好吧。

我想知道如果需要用到频繁修改的小结构。是使用 table 更好,还是 closure 更好呢?

"对象是和某些行为(behaviors)相关联的状态数据(state data),而闭包则是和某些状态数据相关联的行为"。
这话是Peter Norvig说的(Design Patterns in Dynamic Programming. http://norvig.com/design-patterns/ppframe.htm ),我鹦鹉学舌一下。

这个不是FPL里面的经典trick么?用function来实现data type。呵呵

lua 里 {1,2} 也没有用 hash table ,同样也是一个数组。

不过 closure 对 upvalue 的处理还是比它代价小。

字符串只应该在需要给人看的地方才使用,给机器看的地方统统用别的办法代替。ActionScript3里面的非dynamic的对象就没有再使用Hash表

Post a comment

非这个主题相关的留言请到:留言本