学习JavaFX脚本语言----6,7

本文详细介绍了多种操作符,包括连接、运算、一元、关系、条件及类型比较操作符,并通过实例展示了它们的使用方法。
[size=16px]Lesson 6: Operators[/size]

目录:

- 连接操作符
- 运算操作符
- 一元操作符
- 关系操作符
- 条件操作符
- 类型比较操作符

-连接操作符

链接操作符"="是你最常用的操作符之一。使用"=",可以将其右边的值赋给左边的变量。


result = num1 + num2;
days = ["Mon","Tue","Wed","Thu","Fri"];


在前面的章节里面,你已经使用了很多次了。

-运算操作符

运算操作符提供加,减,乘,除的功能。"mod"操作符为求余!

+ (additive operator)
- (subtraction operator)
* (multiplication operator)
/ (division operator)
mod (remainder operator)

下面提供一些例子:


var result = 1 + 2; // result is now 3
println(result);

result = result - 1; // result is now 2
println(result);

result = result * 2; // result is now 4
println(result);

result = result / 2; // result is now 2
println(result);

result = result + 8; // result is now 10
println(result);

result = result mod 7; // result is now 3
println(result);


你还能同时使用运算操作符和连接运算符构成复合运算符。例如 result += 1; 和 result = result+1;两者的效果都是result加上了1.


var result = 0;
result += 1;
println(result); // result is now 1

result -= 1;
println(result); // result is now 0

result = 2;
result *= 5; // result is now 10
println(result);

result /= 2; // result is now 5
println(result);


只有"mod"操作符不能这么写。如果你想求一个数被2除的余数,你需要这么写:

result = result mod 2;


-一元操作符

大部分的操作符需要两个操作数;而一元操作符只需要一个操作数,对操作数进行加/减操作,取负数,如果操作数为boolean,则可以取逻辑反,等操作。

- Unary minus operator; negates a number
++ Increment operator; increments a value by 1
-- Decrement operator; decrements a value by 1
not Logical complement operator; inverts the value of a boolean

例子:


var result = 1; // result is now 1

result--; // result is now 0
println(result);

result++; // result is now 1
println(result);

result = -result; // result is now -1
println(result);

var success = false;
println(success); // false
println(not success); // true


++/--操作符既可以在操作数的前面,也可以在操作数的后面。result++和++result运算的最后效果都是result加1。唯一的区别是result++是先取值后加1,++result是先加1再取值。如果你只是做简单的+/-,那么你用哪种方法都没有影响。但是,如果你在一个复杂的表达式里面使用,那么两种方法可能会不同。

下面的代码演示他们的区别:


var result = 3;
result++;
println(result); // result is now 4
++result;
println(result); // result is now 5
println(++result); // result is now 6
println(result++); // this still prints prints 6!
println(result); // but the result is now 7


-关系操作符

关系操作符用来比较一个操作数是否大于,小于,等于或不等于另一个数。

== equal to
!= not equal to
> greater than
>= greater than or equal to
< less than
<= less than or equal to

下面的代码测试这些操作符:


def num1 = 1;
def num2 = 2;

println(num1 == num2); // prints false
println(num1 != num2); // prints true
println(num1 > num2); // prints false
println(num1 >= num2); // prints false
println(num1 < num2); // prints true
println(num1 <= num2); // prints true


-条件操作符

条件and和条件or是用在两个boolean表达式间的操作符。这两个操作符有"short-circuiting"的特性,就是第二个操作数只有在需要的时候才执行。举个例子,对于and操作符,如果第一个表达式的执行结果是false,那么第二个表达式就不会执行了,当第一个表达式为true的时候,第二个表达式才会执行。

and
or

下面是例子:


def username = "foo";
def password = "bar";

if ((username == "foo") and (password == "bar")) {
println("Test 1: username AND password are correct");
}

if ((username == "") and (password == "bar")) {
println("Test 2: username AND password is correct");
}

if ((username == "foo") or (password == "bar")) {
println("Test 3: username OR password is correct");
}

if ((username == "") or (password == "bar")) {
println("Test 4: username OR password is correct");
}



输出:

Test 1: username AND password are correct
Test 3: username OR password is correct
Test 4: username OR password is correct


-类型比较操作符

instanceof操作符判断一个对象是否是一个特定的类型。你可以使用此操作符来判断,一个对象是否是一个特定的类。


def str1="Hello";
println(str1 instanceof String); // prints true

def num = 1031;
println(num instanceof java.lang.Integer); // prints true


在学了以后的类和继承章节后,你会发现这个操作符很有用。


[size=16px]Lesson 7: Expressions[/size]

目录:

- 块表达式
- if表达式
- 范围表达式
- for表达式
- while表达式
- break和continue表达式
- throw, try, catch 和 finally表达式

-块表达式

块表达式包含一系列的声明或表达式,由大括号包围,且以分号隔开。块表达式的值是块里面最后的表达式的值。如果块里面没有表达式,块表达式就是Void类型。注意,var和def是表达式。

下面的块表达式添加了一些成员并把结果存放在total变量里面:


var nums = [5, 7, 3, 9];
var total = {
var sum = 0;
for (a in nums) { sum += a };
sum;
}
println("Total is {total}.");


输出:

Total is 24.

第一行 (var nums = [5, 7, 3, 9];) 声明了一个整型的序列。

接着声明了一个total变量来保存序列里面的值的总和。

块表达式,为大括号里面的所有代码:


{
var sum = 0;
for (a in nums) { sum += a };
sum;
}


在括号里面,第一行声明了一个变量sum,来保存序列里面的成员。第二行循环序列,取出序列里的成员与sum相加。最后一行,为返回块表达式的值。


-if表达式

if表达式表达式可以根据特定的条件执行特定的一段代码。

例如,下面的代码根据年龄设置票价。12-65岁票价10元。老人和小孩5元。5岁一下的免费。


def age = 8;
var ticketPrice;

if (age < 5 ) {
ticketPrice = 0;
} else if (age < 12 or age > 65) {
ticketPrice = 5;
} else {
ticketPrice = 10;
}
println("Age: {age} Ticket Price: {ticketPrice} dollars.");


年龄设为8时,输出如下:

Age: 8 Ticket Price: 5 dollars.

程序流程如下:


[b]if (age < 5 ) {
ticketPrice = 0;
} [/b]else if (age > 5 and age < 12) {
ticketPrice = 5;
} else {
ticketPrice = 10;
}


如果年龄小于5,票价为0.那么程序就会跳过其他的判断,直接打印出结果。
如果不小于5,那么程序跳转到第二个判断。


if (age < 5 ) {
ticketPrice = 0;
} [b]else if (age > 5 and age < 12) {
ticketPrice = 5;
} [/b]else {
ticketPrice = 10;
}

如果年龄在5-12岁,票价为5.
如果大于或等于12岁,就跳到了else语句里面。

if (age < 5 ) {
ticketPrice = 0;
} else if (age > 5 and age < 12) {
ticketPrice = 5;
} [b]else {
ticketPrice = 10;
}[/b]

这个块,只有在前面的条件都不符合的情况下才执行。设置12岁及以上的人的票价为12.

Note: 上面的代码可简写为:


ticketPrice = if (age < 5) 0 else if (age > 5 and age < 12) 5 else 10;


你最好掌握,在后面的章节将会用到。


-范围表达式

在序列那一讲,你了解到了如果简单的定义一个有序的数字序列。


var num = [0..5];


理论上,[0..5]就是个范围表达式。默认的,数字间递增1,但是你可以使用step关键字来修改递增的值。例如,定义一个1到10之间的所有奇数的序列。


var nums = [1..10 step 2];
println(nums);


输出

[ 1, 3, 5, 7, 9 ]

要创建一个递减的范围,请保证第二个数要小于第一个数,并且要将step设为一个负数。


var nums = [10..1 step -1];
println(nums);


输出:

[ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ]

如果你创建了一个递减的序列,但是没有设定step的值,你将会得到一个空的序列。

下面的代码:


var nums = [10..1 step 1];
println(nums);


将会在编译的时候出现警告:


range.fx:1: warning: empty sequence range literal, probably not what you meant.
var nums = [10..1 step 1];
^
1 warning


如果你忽略了警告,那你得到的是个空的序列。

-for表达式

另一个和序列有关的表达式是for表达式。for表达式提供一个简便的循环结构来遍历序列里的所有项。

下面是个例子:


var days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];

for (day in days) {
println(day);
}


输出:

Mon
Tue
Wed
Thu
Fri
Sat
Sun

让我们来分析这段代码。for表达式以for开头


[b]for[/b] (day in days) {
println(day);
}


days变量是序列的名称,for表达式将遍历此序列。


for (day in [b]days[/b]) {
println(day);
}


day变量依次持有序列里的项


for ([b]day[/b] in days) {
println(day);
}


注意,day变量并不需要声明就可以在for表达式里面使用了。并且,for表达式结束后,day无法被访问。程序员经常给临时变量一个简短的名字以示区别。

在前面的例子里面,for没有显示的返回值。但是for返回一个序列。下面的两个例子来使用for来从一个序列创建另一个序列。


// Resulting sequence squares the values from the original sequence.
var squares = for (i in [1..10]) i*i;

// Resulting sequence is ["MON", "TUE", "WED", and so on...]
var capitalDays = for (day in days) day.toUpperCase();


注意了,toUpperCase方法由String提供。你能在API里找到完整定义。

-while表达式

另一个循环表达式是while表达式。和for不同,不是遍历序列的,而是根据条件来循环的。while是一个语义(syntactically)上的表达式,为Void类型,没有返回值。

给个例子:


var count = 0;
while (count < 10) {
println("count == {count}");
count++;
}


输出:

count == 0
count == 1
count == 2
count == 3
count == 4
count == 5
count == 6
count == 7
count == 8
count == 9

第一行声明了一个变量count并初始化为0


[b]var count = 0;[/b]
while (count < 10) {
println("count == {count}");
count += 1;
}


接着开始while表达式。表达式循环,知道count为10为止。


var count = 0;
[b]while (count < 10) {[/b]
println("count == {count}");
count += 1;
}


循环体中,打印count值,并加1。


var count = 0;
while (count < 10) {
[b]println("count == {count}");
count += 1;[/b]
}


当count为10时,循环结束。如果要创建一个无限循环,条件里改为true关键字,就像这样: while(true){}

-break和continue表达式

break和continue表达式和循环表达式有关。这两个表达式是作用于循环上的:break终止循环,continue跳过当前的循环。

brean和continue是语义(syntactically)表达式。他们为Void类型,没有返回值。

例子:


for (i in [0..10]) {
if (i > 5) {
break;
}

if (i mod 2 == 0) {
continue;
}

println(i);
}


输出:

1
3
5


如果没有if表达式,程序将会简单的输出:0到10。

如果只有第一个if表达式,程序将在i比5大的时候跳出循环。


if (i > 5) {
break;
}


程序将只打印1到5。

加上第二个if后,程序会间隔的执行循环。


if (i mod 2 == 0) {
continue;
}


这里,表达式只有在i为偶数的时候才执行continue。当continue执行的时候,println()将不会被执行,也就不会打印了。


-throw, try, catch 和 finally表达式

在现实世界的应用里面,有时可能会出现不正常的程序流程。例如,一段脚本读取文件,但是文件找不到,那么这段脚本就无法执行了。我们将这种情况称为"异常"。

Note:异常是对象。一般可以从字面意思上知道他们表示的是什么异常。(例如,FileNotFoundException表示了无法找到文件。)但是,下面的例子并不是来展现各种各样的异常的。所以,以普通的异常来说明throw, try, catch, 和 finally

下面的脚本定义一个方法并抛出异常:


import java.lang.Exception;

foo();

println("The script is now executing as expected... ");

function foo() {
var somethingWeird = false;

if(somethingWeird){
throw new Exception("Something weird just happened!");
} else {
println("We made it through the function.");
}
}



运行,输出:

We made it through the function.
The script is now executing as expected...

但是,将变量改为true,异常将被抛出。在运行时,脚本将会中断,并打印如下信息:

Exception in thread "main" java.lang.Exception: Something weird just happened!
at exceptions.foo(exceptions.fx:10)
at exceptions.javafx$run$(exceptions.fx:3)

要阻止程序被异常终端,我们需要用try/catch来捕获foo()抛出的异常。由名字来看,这个表达式的作用是,try执行一些代码,但是发生了问题就catch到了一个异常。


try {
foo();
} catch (e: Exception) {
println("{e.getMessage()} (but we caught it)");
}


现在,程序打印:

Something weird just happened! (but we caught it)
The script is now executing as expected...

还有个finally块 (这个不能算得上是个表达式),不论是否有异常,finally块里的代码都会被执行。finally块一般是用来做清理工作的。


try {
foo();
} catch (e: Exception) {
println("{e.getMessage()} (but we caught it)");
} finally {
println("We are now in the finally expression...");
}


程序输出:

Something weird just happened! (but we caught it)
We are now in the finally expression...
The script is now executing as expected...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值