本文主要是介绍Lua程序设计(五十八),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
记忆技术(memorization technique)还可以用来确保某类对象的唯一性。例如,假设一个系统用具有三个相同取值范围的字段red、green和blue的表来表示颜色,一个简单的颜色工厂函数每被调用一次就生成一个新颜色:
function createRGB (r, g, b)return {red = r, green = g, blue = b}
end
使用记忆技术,我们就可以为相同的颜色复用相同的表。要为每一种颜色创建一个唯一的键,只需要使用分隔符把颜色的索引连接起来即可:
local results = {}
setmetatable(results, {__mode = "v})
function createRGB(r, g, b)local key = string.format("%d-%d-%d", r, g, b)local color = results[key]if color == nil thencolor = {red = r, green = g, blue = b}results[key] = colorendreturn color
end
这种实现的一个有趣结果就是,由于两种同时存在的颜色必定是由同一个表来表示,所以用户可以使用基本的相等符比较两种颜色。因为随着时间的迁移垃圾收集器会清理表results, 所以一种指定的颜色在不同的时间内可能由不同的表来表示。不过,只要一种颜色正在被使用,它就不会从results表中被移除。因此,一种颜色与一种新颜色相比已经存在了多长时间,这种颜色对应的表也存在了对应长度的时间,也可以被新颜色复用。
对象属性
弱引用表的另外一种重要应用就是将属性与对象关联起来。
当对象是一个表时,可以通过适当的唯一键把属性存储在这个表自身中。不过,如果对象不是一个表,那么它就不能保存自己的属性。另外,即使是表,有时我们也不想把属性保存在原始的对象中。
外部表为对象和属性的映射提供了一种理想的方法即对偶表示。其中将对象用作键,将对象的属性用作值,
这种方案却有一个缺陷:一旦我们把一个对象当做表中的一个键,那么就是引用了它。Lua语言无法回收一个正在被用作建的对象。例如,如果使用一个普通的表来映射函数和函数名,那么这些函数就永远无法被回收。
这篇关于Lua程序设计(五十八)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!