
import console;
/**
table(表)
table(表)是aardio中唯一的复合数据类型,除了非复合的基础数据类型以外,aardio中几乎所有的复合对象都是表,即使是变量的命名空间也是表。表的本质是一个集合(collection),可以用于容纳其他的数据成员,并且表也可以嵌套的包含其他的表(table),在aardio里表几乎可以容纳一切其他对象。
如果我们把字符串、buffer、数值、函数、指针.....这些基础数据类型比喻为盘子中的菜,那么表这样的复合数据类型就是装菜的盘子,
如果没有了盘子,所以就没有办法愉快的吃菜了(相当于在程序代码中传输、使用数据)。
一、表的类型
表(table)包含的数据结构也被称为字典(dictionaries)、列表(list)、映射(map)、关联数组(associative arrays)、对象(object)......等等.虽然在不同的编程语言里的具体实现存在差异(例如有序或无序存储、使用或不使用哈希算法),但基本都是用来包含不定个数的键值对成员。
aardio中的表可以包含不定个数的成员,每个成员都由一个键值对组成(键用来指定成员的名称,值用来指定成员的值)。“键”可以任何除null以外的数据类型,甚至可以在table元素中包含table,table允许嵌套。“值”也可以任意数据类型,当值为null时表示删除该成员。
通常把“键”放在索引操作符“[]”中来索引一个元素的值,这时候键又称为“下标”或“索引”。例如 tab["键"] tab[1],“[]”则被称为下标操作符。也可以把一个符合变量命名规则的键放在成员操作符“.”后面,例如 tab.key tab.key2 ;
根据键的存取排序规则,表包含的成员分为以下两种类型( 表可以同时包含以下两种类型的成员 )
**/
// 创建一个空表
var table_1 = {};
console.dump(table.unpack(table_1));
/**
a)、哈希表(无序集合)
aardio中的表是哈希表( hash table ),哈希表使用哈希算法存取,不会按其他特定顺序排序(在代码中添加成员的顺序将被忽略),所以在遍历哈希表时的顺序并不一定会保持代码中书写、添加表成员的顺序,因为我们把这种集合称为无序集合。
哈希表的优势是查找速度非常快,即使表包含的成员非常多,仍然可以快速的访问成员键值对。
**/
tab1 ={
name = "张三",
age = 20 ,
[123] = "测试测试",
course = {
"语文": 100,
"数学":90,
"英语":95
}
};
// 输出访问table成员
console.dump(tab1.name,tab1.age,tab1[123],tab1.course.语文,tab1.course.数学,tab1.course.英语);
console.log('---------------------')
/*
b)、数组(有序集合)
如果表中不定个数的成员的“键”是从1开始、有序、连续的数值,那么这些成员构成一个有序数组。
在创建数组时,数组的键可以省略不写。
表总是可以同时包含数组、以及非数组成员, 即使不包含数组成员,我们也可以将表作为空数组处理。
有序数组可以使用 for 循环(或者table.eachIndex)有序的遍历成员,下面我们看一个在aardio中使用数组的简单演示
*/
for(k,v in tab1){
console.log(k,v)
}
console.log('---------------------')
var tab2 = {
[1] = 0,
[2] = 2,
[3] = 10
}
for(i=1;#tab2;1){
console.log(tab2[i])
}
console.log('---------------------')
for(k,v in table.eachIndex(tab2)){
console.log(k,v)
}
for(k,v in tab2 ){
console.log(k,v)
}
console.log('---------------------')
/*
稀疏数组不应当作为有序数组使用,也不应当使用 # 操作符去获取数组长度。
稀疏数组可以用 table.range() 获取最小索引、最大索引。
也可以使用 table.eachArgs() 遍历稀疏数组。
*/
var sparseArray = { "值:1", null, "值:2", "值:4" }
//获取稀疏数组长度
var min,max = table.range(sparseArray);
console.log(min,max);
//遍历稀疏数组(可用于遍历函数的不定参数)
for i,v in table.eachArgs(sparseArray) {
console.log(i,v)
}
console.more(1);
//无序的哈希表
var tab = {
c = "3";
b = "2";
a = "1";
}
//有序的数组
var keys = {
"c","b","a"
}
//用数组排序
for(i,k in keys){
//用表查找值
console.log(k,tab[k])
}
console.log('---------------------')
console.more(1);
//用数组排序
table.sort(keys);
//用数组排序
for(i,k in keys){
//用表查找值
console.log(k,tab[k])
}
console.pause(true);