2008年7月12日 星期六

Script-Tip008關於Tables(Arrays)

在AMS中Tables是一個特別且非常有用的資料型別,您可用它來存放各類型的資料值,包含function或其他Tables
*建立Tables
有二種方法可以在程式中建立Tables第一種方法是用{ }將元素值包含在裡面,如下:
my_tables = {"元素一","元素二","元素三"};

my_tables = {name = "coffee", tel = "06-2841700"};

※Tables本身有二種陣列(Arrays)類型,像上面第一種是「數列式」,第二種是「關聯式」的。
第二種建立Tables的方法,是先建一個空的Tables再加入元素,如下:

my_tables = {};
my_tables[1] = "元素一";
my_tables[2] = "元素二";
my_tables[3] = "元素三";

my_tables = {};
my_tables.name = "coffee";
my_tables.tel = "06-241700";

上面的說明中第一種寫法是針對數列式的Tables,第二種是針對關聯式的Tables

* 存取Tables中的元素(存在Tables中的資料,每一筆以 , 分開)
儲存在Tables中的資料稱為「元素」,每個元素都含有一個key(鍵),這個key就關聯著它所代表的值,而這個key就是我們所謂的「索引(index)」。在AMS中Tables包含二種列陣,一為數列型陣列,它的index是數列組成,由1開始,另一類是關聯型的陣列,它的index可以是字串、數字、涵數。
※數列型陣列
--這個Tables中含有四個元素,值是e1,e2,e3,e4,它們的index是1~4
n_table = {"e1","e2","e3","e4"};
--存取其中元素的方法→ Tables名[第幾個元素],如n_table[2]代表第二個元素的值
Dialog.Message("table test", n_table[2]);
--這會顯示對話盒,其中的文字為 e2

※關聯型的陣列
--這個Tables中含有三個元素,值是one, two, three ,index分別為first, second, third
a_table = {first = "one", second = "two", third = "three"};
--存取這類陣列要利用「點運算子」,a_table.second 代表第二個元素的值
t = a_table.second
--這表示指定"two"給 t 這個變數
下面是一個較複雜的Tables的範例


code:--------------------------------------------------------------------------------
a = {}; --定義一個空的陣列
--定義二個關聯式陣列,分別儲存二個人的資料
b1 = {name = "王小明", sex = "男 ", age = "10"};
b2 = {name = "陳小美", sex = "女 ", age = "9"};
--再分別將二個陣列存到a陣列裡
a[1] = b1;
a[2] = b2;
--想要取得陳小美的年齡
Dialog.Message("title", a[2].age);
--------------------------------------------------------------------------------


*用For 迴圈列舉Tables中所有的元素
有一個很特別的迴圈可以用來將Tables中的所有元素一個一個提出來,其程式模型如下:
for index,value in table do
--運用元素的程式碼
end

for in do是關鍵字,迴圈以end作為結束,index及value是取二個變數名稱來代表目前迴圈所到達的元素的索引值及字串值,table是您想讀的Table名稱
範例:

code:--------------------------------------------------------------------------------
my_t = {"one", "two", "three"};
for j , k in my_t do
Dialog.Message("table test", j.."="..k);
end
--------------------------------------------------------------------------------

上面的程式碼會跳出三次的對話盒,中間顯示的字分別為「1=one」,「2=two」,「3=three」

※另一個範例

code:--------------------------------------------------------------------------------
my_t = {one=1, two=2, three=3};
for k in my_t do
Dialog.Message("table test", k);
end
--------------------------------------------------------------------------------

上面的程式定義了一個關聯式的陣列,利用迴圈列舉,但只是想取得每個元素的索引,上面的程式執行後會跳出三次的對話盒,中間顯示的字分別為「one」,「three」,「two」,這裡有個問題便是為什麼顯示的順序不是按照tables中元素的排列順序,原因是因為使用關聯式的陣列的時候,是以「雜湊表」來儲存資料,所以順序會依某些規則重新排列,若您使用數列型的陣列,就不會有這種情形了。

*複製Tables
之前曾提過:您不能以 = 的方式來複製Tables,因為這樣並不能讓Tables成為二個複本,只是讓二個變數指向同一個Tables而已

code:--------------------------------------------------------------------------------
t_one = {one = "spring", two = "summer"};
t_two = t_one;
t_two.one = "winter";
Dialog.Message("table one" , t_one.one);
Dialog.Message("table two" , t_two.one);
--------------------------------------------------------------------------------

上面的程式會跳出二個對話盒,不過裡頭的文字都是 winter,這証明Tables只有一份,並沒有被複製出另一份

※若想真正複製出另一個Tables,寫法應如下:

code:--------------------------------------------------------------------------------
t_one = {one = "spring", two = "summer"};
t_two = {};
for i , v in t_one do
t_two[i] = v;
end
--------------------------------------------------------------------------------

如此t_two便成為一個獨立的Table且內含的元素和t_one一樣

*AMS中還有很多用於處理Tables的內建涵數

沒有留言: