现在你的环境已经建立起来,是时候写你的第一个脚本了!这一节我们将通过编写一个简单的计算器程序来学习一些基本语法。这些实践带你了解:编译源代码、运行程序、声明变量、定义和触发函数、向函数传递参数、使用命令行参数。
Contents
- Writing a Simple Calculator
- Declaring Script Variables
- Defining and Invoking Script Functions
- Passing Arguments to Script Functions
- Returning Values from Script Functions
- Accessing Command-Line Arguments
Writing a Simple Calculator
写一个简单的计算器
首先点击
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是一种编译语言,意味着在Java虚拟机运行它之前,你必须把源代码转化为字节码。
下面是编译脚本的命令:
javafxc calculator.fx
编译之后,你会发现一个名为calculator.class的字节码文件。你还会注意到另一个名为calculator$Intf.class的文件。它是运行程序所必须的:你可以忽略它,但不能删除它。
您现在可以用下面的命令运行编译后的class文件了。
javafx calculator
The output is:
结果如下:
100 + 2 = 102
100 - 2 = 98
100 * 2 = 200
100 / 2 = 50
这个程序虽然小,但体现了一些重要的语法结构。学习这些结构将是你熟练应用JavaFX的第一步。
注意:JavaFX语言并不难学,但因为你是新手,我们将仅限于讨论我们接触到的程序细节。目标很清晰。高级的用法将通过接下来的课程学习。
Declaring Script Variables
声明变量
让我们回顾一下calculator.fx,然后扩展它。
第一段定义了一些变量:
def numOne = 100;
def numTwo = 2;
var result;
变量用var或def关键字声明。它们的区别在于var变量可以被赋予新值,而def变量一旦赋值就保持不变。我们给numOne和numTwo赋值,但result变量未被初始化因为这个变量将保存计算结果。
变量名由字母和数字组成,不能以数字开头。约定俗成的惯例是采用小写字母;如果由多个单词组成,就像上面的例子一样,除第一个单词之外,其他单词的第一个字母大写。
注意:也许你已经注意到了,我们没有刻意声明这些变量是接受数字类型数据(与字符串或其他数据类型形成对照)的。编译器根据上下文聪明地识别出了您的意图。这被称作类型推导。类型推导使程序员的工作更轻松,因为它使程序员从声明数据类型的烦恼中解放出来。
Defining and Invoking Script Functions
定义和触发函数
接下来的源代码定义了两个数字相加、相减、相乘、相除4个函数:
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}");
}
函数是用来完成特定功能的可执行的一段代码。在我们的例子中,每一个函数执行一种数学计算并且打印结果。写函数是使代码更易阅读、使用、调试的常用方法。函数体用大括号括起来,使它更易阅读。
函数直到被触发,才会执行函数体的代码。这使得你可以将它放置在程序的任何位置,函数调用在函数声明的前面或后面都无关紧要。在我们的例子中,就在声明的位置之前触发了函数。
The function invocations are as follows:
函数调用如下所示:
add();
subtract();
multiply();
divide();
Passing Arguments to Script Functions
向函数传递参数
接下来我们将修改calculator函数以接受参数。参数是触发函数时传入的特定值。这一步使calculator可以计算任意两个数字,而不只是硬编码在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}");
}
The output of this script is now:
100 + 10 = 110
50 - 5 = 45
25 * 4 = 100
500 / 2 = 250
在这个版本里面我们去掉了不再需要的numOne和numTwo两个变量。修改函数定义使得两个数值作为参数可以传入。用一个参数名,一个冒号,和参数类型指定一个参数。多个参数用逗号间隔。
Returning Values from Script Functions
函数返回值
函数可以向触发它的代码返回一个值。例如,修改的相加函数可以成返回result值,粗体的文本显示了如何去做:
function add(argOne: Integer, argTwo: Integer) : Integer {
result = argOne + argTwo;
println("{argOne} + {argTwo} = {result}");
return result;
}
相加函数可以这样触发:
var total;
total = add(1,300) + add(23,52);
如果没有指定返回值,函数默认返回Void。
Accessing Command-Line Arguments
使用命令行参数
我们还可以修改calculator脚本使它可以使用命令行参数。这可以使最终用户在运行时指定要计算的数值。
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里保存了所有的命令行参数,args是一个字符串对象的序列(序列是对象的有序列表,类似于其他语言里的数组,在表达式和操作符这两节里有详细介绍)。
运行这个脚本,用户在运行时需要指定第一个和第二个数值:
javafx calculator 100 50
The output is now:
100 + 50 = 150
100 - 50 = 50
100 * 50 = 5000
100 / 50 = 2
注意:在先前的版本里,我们没有提供run函数。我们只是录入了一些代码,而它运行如常。这种情况下,编译器悄悄地创建了一个没有参数的run函数,并且把我们录入的要执行的代码放置了进去。
我们重新放置了numOne和numTwo变量,这一次用run函数包含了它们。calculator函数想得到数值类型,但命令行参数却是字符串类型;因此我们在使用它们之前必须将它们从字符串类型转换为数字类型。
// Convert Strings to Integers
def numOne = java.lang.Integer.parseInt(args[0]);
def numTwo = java.lang.Integer.parseInt(args[1]);
我们可以借助Java语言的帮助来实现类型转换。借助Java系统可以给这种简单的脚本语言带来极大的能力。