对象属性

  有很多情况需要把有些属性绑定到某个对象,例如:函数与其名称、table的默认值、数组大小等...

当对象是一个table时,可以通过适当的key将属性存储在这个table中。

如果对象不是一个table,它就无法保存属性了。

另外,即使是table,有时也不想将属性存储在原table中。可以使用外部table来关联它们,将对象作为key,对象的属性作为value。

这个外部table可以保存任意对象的属性,Lua也允许将任何对象作为table的key。

另外,存储在外部对象中的属性不会干扰其他对象,只要table本身是私有的,这些属性也会是私有的。

  然而,有一个缺陷,当用户将一个对象作为外部table的key时。就引用了它,Lua是无法回收一个作为table key的对象。

如果这个外部table关联函数和函数名,那么这些函数就永远无法回收。

可以用弱引用来解决这个问题。该情况使用的是弱引用key,当一个弱引用key没有其他引用时,Lua就回收它。

table的默认值

  之前在table访问元方法一节最后提到过,用两种方法实现具有非nil默认值的table:一种是弱引用table,一种是备忘录。

它们其实就是之前讲到的备忘录和对象属性的特殊应用。

第一种方法:用一个弱引用table,通过它将每个table与其默认值关联起来:

local defaults = {}
setmetatable(defaults, { __mode = "k" } )
local mt = { __index = function(t) return defaults[t] end }
function setDefault ( t , d)
defaults[t] = d
setmetatable( t , mt )
end

如果defaults没有弱引用key,它就会使所有具有默认值的table持久存在下去。

第二种方法:对每种不同的默认值使用不同的元表,不过,只要有重复的默认值,就复用同样的元表。这是备忘录的典型应用:

local metas = {}
setmetatable(metas , {__mode = "v"})
function setDefault(t, d )
local mt = metas[d]
if mt == nil then
mt = {__index = function() return d end}
metas[d] = mt --备忘录
end
setmetatable(t , mt)
end

这里用到了弱引用value,这样当metas中的元表在不使用时就可以被回收了。

第一种的做法需要为每个table的默认值(defaults中的一个条目)使用内存。

第二种的做法需要为每个不同的默认值使用一组内存(一个新table、一个新closure和metas中的一个条目)。

如果程序上有上千个table和一些默认值,第二种是首选;但是只有很少的table共享几个公用的默认值,就选第一种。

以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》

Chapter 17_3 table的默认值的更多相关文章

  1. chapter 13_3 table访问的元方法

    前两节的算术类.关系类运算符的元方法都为各种错误情况定义了行为,它们不会改变语言的常规行为. 但是Lua还提供了两种可以改变table行为的方法: 一种是查询table中不存在的字段.一种是修改tab ...

  2. (转载)JAVA中八种基本数据类型的默认值

    原文链接: http://simon-c.iteye.com/blog/1016031 引用 For type byte, the default value is zero, that is, th ...

  3. 慎用create table as select,一定要注意默认值的问题

    再做一些数据迁移时候,很多人会使用create table  as select * from table where id=-1的方式来年建立一摸一样的表,但是这样做有个很大的弊端,不能将原表中的d ...

  4. PowerDesigner 怎么给 Table Properties 增加注释和默认值

    1.  选中表,右键 2. 选中“comment”, 这个就是列的注释 3.还是这个页面 ,往下有个“default value”, 这个就是你设置的默认值. 4. 这个是怎么设置默认值.

  5. [转]Hibernate设置时间戳的默认值和更新时间的自动更新

    原文地址:http://blog.csdn.net/sushengmiyan/article/details/50360451 Generated and default property value ...

  6. Hibernate设置时间戳的默认值和更新时间的自动更新

    Generated and default property values 生成的和默认的属性值 The database sometimes generates a property value, ...

  7. Entity Framework 6 Recipes 2nd Edition(12-7)译 -> 设定默认值

    12-7. 设定默认值 问题 在把一个实体保存到数据库之前,设置该实体属性的默认值 解决方案 假设你有一个如Figure 12-9所示的表, 它保存采购订单(purchase order). 主键Pu ...

  8. sql 修改字段默认值

    1.查出该字段的约束名称 SELECT c.name FROM sysconstraints a INNER JOIN syscolumns b on a.colid=b.colid INNER JO ...

  9. ASP.NET MVC 让@Html.DropDownList显示默认值

    在使用@Html.DropDownList的过程中,发现它的用法很局限,比如在加载的时候显示设定的默认项或者调整它的显示样式,在网上查了一些资料,终于把这个问题解决了. 一.View代码 @using ...

随机推荐

  1. GitHub删除文件

    删除单个文件 一般情况下,通常可直接在文件管理器中直接把文件删了,或者用rm命令删了 $ rm README.txt 这个时候,工作区是删除了,可版本库还没有.git status命令会立刻告诉你哪些 ...

  2. [原创]opencv实现图像拼接,制做全景图

     转载请注明:http://www.cnblogs.com/ausk/p/3332255.html    调用opencv2.4.6中的库函数,实现图像的拼接功能,傻瓜式拼接,不需要太多的专业知识.. ...

  3. 前端基于easyui的mvc扩展(续)

    前端基于easyui的mvc扩展(续) 回顾及遗留问题 上一篇讲解了基于easyui的mvc扩展的基本实现,已经降低了在mvc内使用easyui的难度,但是仍然还有一些问题: 当我们要给生成的控件设置 ...

  4. 使用 App Studio 快速定制一个你自己的专属应用

    使用 App Studio 快速定制一个你自己的专属应用 如果已有做一个手机应用的想法,只需要一些简单的图片,视频,或者RSS源,就可以通过App Studio制作出你心仪的应用! App Studi ...

  5. ASP.NET MVC:会导致锁定的会话

    ASP.NET MVC:会导致锁定的会话 背景 一直没有意识到会话的访问会导致会话锁定,现在想想这样设计是非常合理的,不过某些情况下这样会导致同一个会话的并发访问非常低(只能串行化),好在MS提供了机 ...

  6. .net SoapHeader验证

    .net SoapHeader验证 在工作中经常用到webservice,在.net 开发中经常用到webservice,在java开发经常用到cxf. 今天闲置没事就介绍下 .net webserv ...

  7. 半同步半异步模式的实现 - MSMQ实现

    半同步半异步模式的实现 - MSMQ实现 所谓半同步半异步是指,在某个方法调用中,有些代码行是同步执行方式,有些代码行是异步执行方式,下面我们来举个例子,还是以经典的PlaceOrder来说,哈哈. ...

  8. 关于JSF国际化问题

    由于最近一个项目的MVC层框架用的是JSF,所以在摸索中遇到了不少的问题,其中有一项就是关于国际化的的问题. 小弟在网上找了很多的资料,其实无外乎内容就都那样,可不知是小弟人品太差还是由于确实技术上有 ...

  9. vsftp FTP服务器 server settings , and add different users

    建议阅读知识:http://linux.vbird.org/linux_basic/0210filepermission.php  这是关于档案权限,用户,组等的问题.介绍的很有意思. 1. Inst ...

  10. java中的instanceof

    instanceof是Java.php的一个二元操作符(运算符),和==,>,<是同一类东西.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实 ...