//多维数组
import console;

/*
aardio中的数组可以包含一切，数组成员可以是任意类型，
当然数组的成员也可以是数组，数组可以任意的嵌套包含其他数组。
aardio数组的成员不必限定类型、限定维数，数组也不必先声明大小就可以使用，是非常灵活方便的动态数组。
其实只要稍加了解一下基础语法，这些都是很基础的技能。
*/
var array ={};

array[1] = {};
array[1][1] = {};
array[1][1][1] = {};

//这是一个一维数组
var array ={ 11;12;13;14 }

//这是一个二维数组，其实就是数组的数组
var array ={
	{11;12;13;14};
	{21;22;23;24};
	{31;32;33;34};
}
console.dump( array[2][3] ); //显示第2行第三列的数据

//其实所谓多维数组，只是方便人们理解的一种说法，多维数组也可以用一维数组来表示, 例如:
var array ={
	11;12;13;14;
	21;22;23;24;
	31;32;33;34;
	//会用一维数组却不会用二维数组，这相当于会用1只脚跳着走，却不知道怎么使用自己的2只脚走路是一样的。
	get = lambda(row,col) owner[ (row-1) * 4 + col ]; 
}

//获取第2行第3列的数据，
console.dump( array.get(2,3)  )

/*
其实在编程中，大多时候，我们使用多维数组，并不必要先声明大小和类型，
在aardio中也提供table.array函数可以预分配指定大小、维数、并拥有指定默认值的数组。
而且这个函数非常强大，当然就像前面说的，实际上这个函数在aardio中被使用的不多（因为aardio数组本来就是长度、维数都是动态可变的，灵活且富有弹性的）
*/

//可以在参数中使用任意个参数指定下一维的数组长度,前面的参数指定父数组长度，后面的参数指定子数组长度,最后一个参数指定默认值
var array = table.array( 5/*行*/,5/*列*/,7/*默认值*/ )
console.dump(array)

//默认值也可以指定一个table对象（数组最后一维的成员都会复制一个新的table对象作为默认值,而不是指向同一个table对象）
var array = table.array( 5,5,{} )
console.log( array[1][1] != array[2][2] )
 
//默认值还可以是一个用来创建默认值的函数(或 lambda 表达式 ),并且可以在函数后面指定调用该函数的参数
var array = table.array( 5, table.array,5,{} )
console.dump( array )

//我们甚至可以不指定数组长度，仅指定一个函数，table.array会循环调用该函数并将所有非null返回值返回为数组 
var array = table.array( string.gmatch("abcdef",".")  ) //调用string.gmatch返回的迭代器恰好符合要求
console.dump(array)

console.pause()
