瞭解 JavaFX Script 編程語言 --第 2 課:編寫腳本

既然環境已設置完畢,現在是時候編寫您自己的第一個腳本了!在本課中,我們將通過編寫一個簡單的計算器應用程序來學習一些編程基礎知識。該實踐過程將向您介紹:編譯源代碼、運行應用程序、聲明腳本變量、定義和調用腳本函數、向腳本函數傳遞參數以及訪問命令行參數。

 

目錄

 

編寫一個簡單的計算器
聲明腳本變量
定義和調用腳本函數
向腳本函數傳遞參數
從腳本函數返回值
訪問命令行參數
 

首先單擊 calculator.fx 並將顯示的內容保存到一個文件中。您的文件中應當包含以下代碼:

def numOne = 100;
def numTwo = 2;
var result;

add();
subtract();
multiply();
divide();

function add() {
result = numOne + numTwo;
println("{numOne} + {numTwo} = {result}");
}

function subtract() {
result = numOne - numTwo;
println("{numOne} - {numTwo} = {result}");
}

function multiply() {
result = numOne * numTwo;
println("{numOne} * {numTwo} = {result}");
}

function divide() {
result = numOne / numTwo;
println("{numOne} / {numTwo} = {result}");
}
 

JavaFX Script 編程語言是編譯型語言,這意味着您編寫的任何源代碼都必須首先轉換爲 Java 字節碼(Java 虛擬機所採用的語言)才能在系統上運行。

以下命令將編譯計算器腳本:

javafxc calculator.fx
 

在編譯之後,您將發現相應的 Java 字節碼已經生成並且放置在一個名爲 calculator.class 的文件中。您還會注意到創建了另一個文件:calculator$Intf.class。該支持文件是運行此應用程序所必需的,您可以將其忽略,但不要刪除它。

現在您可以使用以下命令運行經過編譯的類(在 Java 虛擬機中):

javafx calculator
 

輸出爲:

100 + 2 = 102
100 - 2 = 98
100 * 2 = 200
100 / 2 = 50
 

此應用程序可能很小,但它向您介紹了一些重要的編程語言結構。瞭解這些結構是掌握 JavaFX Script 編程語言的第一步。


注:JavaFX Script 編程語言學起來並不難,但是,由於這是您首次接觸它,因此我們將只在適合現有應用程序的詳細程度上討論每個新結構。目的是爲了清晰明瞭。必要時,我們將在剩下的課程中討論高級用法。

讓我們仔細看一下 calculator.fx 示例,稍後我們將擴展此示例。

代碼的第一部分定義一些腳本變量

def numOne = 100;
def numTwo = 2;
var result;
 

腳本變量是使用 var  def 關鍵字聲明的。二者之間的區別在於:在腳本的整個生命週期內都可以爲var 變量賦予新值,而 def 變量在被首次賦予新值後將保持不變。我們已經爲 numOne  numTwo 賦予了特定的值,但 result 卻未初始化,因爲此變量將用來存放計算結果。

變量名通常由字母和數字組成,但不能以數字開頭。約定使用小寫字母;如果名稱由多個詞組成,則將每個後續詞的第一個字母大寫,如上例中所示。


注:您可能還注意到,我們並沒有專門將這些變量指定爲存放數值型數據(而不是字符串或任何其他類型的數據)。編譯器非常智能,可以根據使用變量的上下文來弄清您的意圖。這稱爲類型推斷。類型推斷可以使腳本程序員的工作有所簡化,這是由於它省去了聲明變量與之兼容的數據類型的工作。

源代碼的其餘部分定義一些用來對這兩個數字執行加、減、乘和除操作的腳本函數

function add() {
result = numOne + numTwo;
println("{numOne} + {numTwo} = {result}");
}

function subtract() {
result = numOne - numTwo;
println("{numOne} - {numTwo} = {result}");
}

function multiply() {
result = numOne * numTwo;
println("{numOne} * {numTwo} = {result}");
}

function divide() {
result = numOne / numTwo;
println("{numOne} / {numTwo} = {result}");
}
 

函數是用來執行特殊任務的可執行代碼塊。在我們的示例中,每個函數都執行一種數學計算,然後輸出結果。將代碼組織成函數是一種常見的做法,這會使程序更易於閱讀、使用和調試。函數的主體通常進行縮進,這樣就便於查看函數的開始和結束位置。

只有被明確調用之後,函數代碼纔會實際執行。這樣就可以在腳本的任何位置運行函數。將函數調用放在函數定義之前還是之後無關緊要;在我們的示例源文件中,函數是在實際定義之前調用的。

函數調用如下所示:

add();
subtract();
multiply();
divide();
 

接下來,我們將更新計算器腳本函數以接受參數。參數是指在調用函數時所傳入的特定值。通過此方法,我們的計算器可以對任意兩個數字(而不只是硬編碼到 numOne  numTwo 變量中的值)進行計算。

var result;

add(100,10);
subtract(50,5);
multiply(25,4);
divide(500,2);

function add(argOne: Integer, argTwo: Integer) {
result = argOne + argTwo;
println("{argOne} + {argTwo} = {result}");
}

function subtract(argOne: Integer, argTwo: Integer) {
result = argOne - argTwo;
println("{argOne} - {argTwo} = {result}");
}

function multiply(argOne: Integer, argTwo: Integer) {
result = argOne * argTwo;
println("{argOne} * {argTwo} = {result}");
}

function divide(argOne: Integer, argTwo: Integer) {
result = argOne / argTwo;
println("{argOne} / {argTwo} = {result}");
}
 

此腳本的輸出現在爲:

100 + 10 = 110
50 - 5 = 45
25 * 4 = 100
500 / 2 = 250
 

在該版本中,我們刪除了 numOne  numTwo 變量,因爲不再需要它們了。我們修改了函數定義,要求傳入兩個數字(作爲參數)。每個參數都指定其名稱,後跟一個冒號,冒號後跟其類型。當一個函數接受多個參數時,用逗號分隔每個參數。

可以選擇讓函數向調用它的代碼返回值。例如,可以對 add 函數進行修改以返回結果-粗體文本顯示了具體做法:

function add(argOne: Integer, argTwo: Integer) : Integer {
result = argOne + argTwo;
println("{argOne} + {argTwo} = {result}");
return result;

}
 

現在,可以按如下方式調用 add 函數:

var total;

total = add(1,300) + add(23,52);
 

如果未指定返回值,函數會默認返回 Void

我們可以進一步修改計算器腳本以接受命令行參數。這樣最終用戶就可以指定要在運行時計算的數字。

var result;

function run(args : String[]) {

// Convert Strings to Integers
def numOne = java.lang.Integer.parseInt(args[0]);
def numTwo = java.lang.Integer.parseInt(args[1]);

// Invoke Functions
add(numOne,numTwo);
subtract(numOne,numTwo);
multiply(numOne,numTwo);
divide(numOne,numTwo);
}

function add(argOne: Integer, argTwo: Integer) {
result = argOne + argTwo;
println("{argOne} + {argTwo} = {result}");
}

function subtract(argOne: Integer, argTwo: Integer) {
result = argOne - argTwo;
println("{argOne} - {argTwo} = {result}");
}

function multiply(argOne: Integer, argTwo: Integer) {
result = argOne * argTwo;
println("{argOne} * {argTwo} = {result}");
}

function divide(argOne: Integer, argTwo: Integer) {
result = argOne / argTwo;
println("{argOne} / {argTwo} = {result}");
}
 

此更改引入了幾個新的結構,其中最值得注意的是添加了 run() 函數。與其他函數不同,run() 是充當腳本主入口點的特殊函數。run() 函數會將所有命令行參數存儲在 args(一個 String 對象序列)中。(序列是對象的有序列表,與其他編程語言中的數組相似;表達式運算符中詳細介紹了序列。)

爲了運行此腳本,用戶現在必須在運行時指定第一個數字和第二個數字:

javafx calculator 100 50
 

輸出現在爲:

100 + 50 = 150
100 - 50 = 50
100 * 50 = 5000
100 / 50 = 2
 

注:在所有以前版本的計算器腳本中,我們沒有明確提供 run() 函數,我們只是在腳本級別鍵入了代碼,然後代碼按照預期方式運行。在這些情況下,編譯器會在無提示的情況下生成一個不帶參數的 run() 函數,並將要執行的代碼放在該函數中。

我們還重新使用了 numOne  numTwo 變量,這次將它們的作用域限制在包含它們的 run() 方法。我們的計算器函數接受數字,但命令行參數是字符串;因此,我們必須首先將每個命令行參數從 String 轉換爲 Integer,然後才能傳遞它們以進行處理。

// Convert Strings to Integers
def numOne = java.lang.Integer.parseInt(args[0]);
def numTwo = java.lang.Integer.parseInt(args[1]);
 

爲此,我們藉助於 Java 編程語言來執行實際的類型轉換。根據需要利用現有的 Java 生態系統會給這個原本簡單的腳本語言帶來強大的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章