2008年7月12日 星期六

Script-Tip009關於functions的使用

涵數是AMS中很有用的功能,分為內建涵數及自訂涵數,像Dialog.Message即為內建涵數,您只要提供所需的參數給它,它便為您呈現對話盒,AMS的內建涵數非常的多,只要熟悉他們的用法,您就可以做大部份的事了,當然您也可以自行定義您所需要的涵數,稱為自訂涵數,您需要按照下列的程式模型來定義:

function 涵數名(參數)
欲執行的程式
return 值;
end

以function關鍵字為首,以end結尾,參數是可有可無的,視您的需要,之中包著您的程式碼,若使用return關鍵字,則可讓涵數的執行有「傳回值」。
下面是一個簡單的自訂涵數範例:


code:--------------------------------------------------------------------------------
function Helloworld()
Dialog.Message("Welcome" , "Hello World !!!");
end
--------------------------------------------------------------------------------

上面是一個沒有參數,沒有傳回值的涵數,名為Helloworld(),您可以在任何地方呼叫它,只要在程式上打入下列這一行:

Helloworld();

如此就會呼叫這個涵數並執行其程式碼,會出現一個對話盒(標題為Welcome,文字為Hello World !!!)
※有一件要特別注意的是:在您呼叫某個涵數之前,必須確定它已經在記憶體中被初始化(即涵數已被執行過),所以我們通常會將自訂涵數集中寫在Globals Functions中,如此當程式啟動時便可確保這些涵數都已初始化了。

*涵數的傳入值(參數)
以下範例:

code:--------------------------------------------------------------------------------
--定義一個含有一個參數的涵數
function HelloWorld(a1)
Dialog.Message("title", a1);
end
--在其他地方呼叫它
HelloWorld("大家好!");
--------------------------------------------------------------------------------

如同上面的範例,執行的結果會出現一個對話盒,標題為title,文字列為 大家好!
當我們在定義涵數時,指明了這個涵數必須含有一個參數(傳入值),所以呼叫的時候就必須寫入您要傳入的字串或數字才不會出錯。上例在呼叫涵數時傳入了「大家好!」這個字串,意思便是以「大家好!」這個字串代表a1這個變數在涵數中的程式碼使用。
當然傳入值理論上可以定義無限多個,就看您的需要了,如下例:

code:--------------------------------------------------------------------------------
--定義一個含有2個參數的涵數
function HelloWorld(a1,a2)
Dialog.Message(a1, a2);
end
--在其他地方呼叫它
HelloWorld("大家好!","世界和平!");
--------------------------------------------------------------------------------

上面的程式碼定義了涵數有二個參數,所以呼叫時便傳入二個字串為參數(以逗點隔開),參數會依次序引入,用「大家好!」代表a1,用「世界和平!」代表a2

*涵數的傳回值
有時候我們寫一些涵數來做特定的事,並希望它將執行的結果(稱為傳回值)傳回給呼叫它的程式,以便繼續運用它執行的結果,如下例:

code:--------------------------------------------------------------------------------
--定義一個涵數,有2個參數,且有一個傳回值
function BMI(x,y)
bmi = y/(x*x);
return bmi;
end
--呼叫
my_var = BMI(1.65, 60);
--------------------------------------------------------------------------------

上面的程式中,特別注意的是傳入二個參數後,涵數內部會用這二個參數做運算,並用return關鍵字傳回計算的結果給呼叫它的式子,所以my_var的值便是計算後的結果。

※多重傳回值

code:--------------------------------------------------------------------------------
--定義一個涵數,有2個參數,且有2個傳回值
function sortNumbers(number1,number2)
if number1 <= number2 then
return number1, number2;
else
return number2, number1;
end
end
--呼叫
first_num, second_num = sortNumbers(number1,number2);
--------------------------------------------------------------------------------

注意上面程式中的呼叫語法,因為有二個傳回值,所以定義二個變數來接收

※重新定義涵數內含的方法很簡單,只要您在程式的其他地方用同一個名稱來定義涵數,那原本同名的涵數就會被覆蓋。

※將涵數放入Tables中
如果您想寫一個大型的程式,用到很多自訂的涵數,您可以考慮將涵數一個個放入Tables中,以便統一管理。
範例:

code:--------------------------------------------------------------------------------
--涵數一
function sun()
Dialog.Message("title", "我是太陽!");
end
--涵數二
function moon()
Dialog.Message("title", "我是月亮!");
end
--建一個空Tables
Hello = {};
--將涵數放入Tables中
Hello.s = sun;
Hello.m = moon;
--呼叫的方法
Hello.s();
Hello.m();

沒有留言: