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

使用 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 中有介绍

TrackBack

如果你想引用这篇文章,请复制下面的链接发送引用通告(GBK)
http://blog.codingnow.com/mt/mt-tb.cgi/86

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

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