【语法知识】table数据 本帖最后由 qqmmcc 于 2011-1-5 21:23 编辑 AAuto中使用table数据类型可方便的支持表驱动法编程。
table是AAuto中唯一的数据结构类型,用来构建有序或无序的集合(collection)。 一。结构 1、表结构
1.1、哈希表二、构造表构造表 用{}操作符构造新的table对象,并以分;号分隔每一个元素 (不能使用逗号代替分号)。如果成员是一个函数并以}或end结束时,可以省略分隔符。 {}操作符在表达式中只能作为赋值表达式的右值、函数参数、或被包含在另一个table构造器中,而不允许与其他操作符结合,不允许向前结合、向后结合,仅允许被括号{}[]()包含。 创建一个空的table。 table元素可以使用各种数据类型的变量,甚至可以是一个表达式或者一个函数,如果我们为table中的值赋于一个键名字,则在table字典中添加一个键值对。 point = { x=100 ; y=200 } 可以在一个table中同时包括“数组”、“字典”。 tab = {x=100;y=200;"Sunday"; "Monday"} table的键名并不要求符合变量命名规则,键可以是任何除null以外的值或字符串。 但是在{}构造器中的键名必须符合变量命名规则。 在任何时候,table中不符合变量命名规则的键必须通过[]操作符访问,以下是正确的写法: tab = { [1]=300;[2]=400;["+"]=200;[1+1]=200 }; //因为变量名不能以数字开始,更不能包含运算符。 以上的写法等价于 tab ={}; 我们可以把多个变量用一对花括号包含起来以转换为table数组,也可以通过table.unpack函数将table数组转换为多个变量。 tab = {"a";"abc";"abcd"} ; //多个变量创建一个table; 三、在函数参数中构造表 当在函数内部有且只有一个使用{}构造器构建的table参数时,并且不包含数组元素,则{}可以省略。 例如: func( { k = 123 ; k2=456 } )func( k = 123 ; k2=456 ) 四、访问table成员 在访问table中的元素时,用元素的键作为下标查询元素的值,例如: tab = {}; //用一对花括号创建一个空的table 如果“键”是一个数字索引称为“键索引”,如果键是一个字符串称为“键名” , 对于符合变量命名规范的键名,可以用"."成员符访问。 例如: tab["x"] = 200; 也可以写为 tab.x = 200; 当我们将tab元素赋值为null会删除这个元素。 例如: tab.x = null; //删除tab.x 五、遍历table 遍历table列表中的全部元素 io.open(); //打开控制台窗口,用来支持print函数 遍历table列表中的数组元素(有序出现) io.open(); //打开控制台窗口,用来支持print函数 【示例】 //打开控制台,开始我们的演示 作者: look 时间: 2010-12-28 19:06 温故而知新,请问: 如果table中的部份元素使用了数字键但是并未包含在从1开始有序连续的数值索引中、则构成稀疏数组。 能举个例子吗? 作者: look 时间: 2010-12-28 19:22 发现一处错误! /1.3、用for循环遍历每个数组成员 for (i=1;#days;1){ io.print( days ) } 作者: ultra95 时间: 2010-12-31 22:57 本帖最后由 ultra95 于 2010-12-31 23:04 编辑 请问多维动态数组如何创建 tab={{{}}} i,j,k tab[j][k]=“cccc” i,j,k只能等于1,其它数字则不行 作者: fantasynew 时间: 2010-12-31 23:39 感谢q版的辛勤工作 作者: ultra95 时间: 2011-1-1 10:56 array = table.new( 10, {} ) 这个只能在开始创建吧,我的意思是根据计算的需要动态扩展大小 ,而且表中原来的数据不能破坏 作者: admin 时间: 2011-1-1 11:35 AAuto的数组本就是动态的。 例如你写 tab = {“我是数组成员”} 这时候 tab[1] 是一个字符串,tab[2]是一个null空值,那么你写tab[1][2] 或者 tab[2][2] 都是没有道理的了。 因为table的成员可以是任何对象,当然也可以是table,你不能对不是table的成员或者空值来使用[]这个索引。 实际上你打开preload库,看一下table.new的源码就可以明白。 例如 tab = {} 你要写tab[2][2] 你就先要写 tab[2] = {} 然后你就可以写 tab[2][2] 了。 或者: array = table.new( 10, {} ) array[11]= { [1] = 123; [2] = 456 } 都是可以的。 作者: admin 时间: 2011-1-1 11:37 正是因为数组是动态的,所以AAuto里并没有初始化数组大小的语句,因为没有这个需要。 table.new这是自定义的一个函数,仅仅是为了兼容其他语言的一些习惯,实际上没有必要做这个初始化。 作者: ultra95 时间: 2011-1-1 13:23 哦, 可能有点不习惯,我再试试 谢谢管理员回复, IDE好像有点小问题,控制台程序在运行循环的情况下,按CTRL+C中止后,再点F5运行,会出现错乱 ,好像上次运行未完全退出似的 作者: admin 时间: 2011-1-1 14:23 CTRL+C 并不终止程序,只是关闭控制台 |
|