表达式是等价于一个结果值的一段代码,可以复合以产生更长的表达式。JavaFX是一种表达式语言,这意味着一切内容,包括循环,条件控制,甚至代码段,都是表达式。在某些情况下(例如while表达式),表达式是Void类型,并不返回任何结果。
Contents
- Block Expressions
- The if Expression
- Range Expressions
- The for Expression
- The while Expression
- The break and continue Expressions
- The throw, try, catch and finally Expressions
Block Expressions
块表达式
块表达式包含一个被大括号括起来的用分号间隔的声明或表达式的列表。块表达式的值是最后一个表达式的值。如果块表达式为包含任何表达式,则为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。最后一行设置块表达式的返回值。
The if Expression
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.
程序流控制如下:
if (age < 5 ) {
ticketPrice = 0;
} else if (age < 12 or age > 65) {
ticketPrice = 5;
} else {
ticketPrice = 10;
}
如果age小于5,票价设成0。
然后程序跳过了接下来的条件验证,并打印出结果。
如果age不小于5,程序执行接下来的条件验证:
if (age < 5 ) {
ticketPrice = 0;
} else if (age < 12 or age > 65) {
ticketPrice = 5;
} else {
ticketPrice = 10;
}
如果age在5到12之间或大于65,票价设为5。
如果age在12和65之间,程序执行最后一段被else关键字标示的代码:
if (age < 5 ) {
ticketPrice = 0;
} else if (age < 12 or age > 65) {
ticketPrice = 5;
} else {
ticketPrice = 10;
}
这一段在以前的条件都不成立的情况下执行。将age在12和65人的票价设为10。
---------------------------------------------------------------------
注意:以上代码可以用一个简明的条件表达式取代:
ticketPrice = if (age < 5) 0 else if (age < 12 or age > 65) 5 else 10;
这时一个很有用的技巧,你还将在以后的教程中看到。
---------------------------------------------------------------------
Range Expressions
范围表达式
在序列那一节已经告诉过你遵循等差数列的数字序列简写形式:
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
你也将得到一个空序列,如果你省略了step值,在上面的例子中。
The for Expression
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关键字开始:
for (day in days) {
println(day);
}
days变量是被for表达式执行的输入序列的名字:
for (day in days) {
println(day);
}
day变量接收for表达式循环序列时的当前序列项:
for (day in days) {
println(day);
}
注意for表达式中,day变量不需要在使用前声明。进一步说,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文档里看到所有有用的函数列表。
The while Expression
while表达式
另一个循环结构是while表达式。不像其他的操作序列的表达式,while表达式一直执行直到给定的条件为false。while在语法上是一个表达式,类型为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
The break and continue Expressions
break和continue表达式
break和continue与循环表达式有关。这两个表达式影响着循环进程:break跳出循环,continue放弃本次循环。
break和continue在语法上算是表达式,类型为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;
}
程序将打印从0到5的数字。
在增加第二个if表达式的情况下,程序放弃当前循环,继续下次循环;
if (i mod 2 == 0) {
continue;
}
这种情况下,只有当i是偶数时continue才执行。一旦执行,下面的println()将不再被调用,数字将不会输出。
The throw, try, catch and finally Expressions
throw,try,catch,finally表达式
在程序实际运行时,很多事件会打破代码的正常执行流程。例如,当程序读取文件的时候,文件不存在,程序将不被执行。我们称这种情况为“异常”。
---------------------------------------------------------------------
注意:异常也是对象。它们的类型通常以它们代表的情况来命名(例如,FileNotFoundException代表文件未找到的情况)。无论如何,向上面的例子中定义特定的异常超出了这一节的范围。我们将使用一个通用的Exception(从Java语言中借来的)来展示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 {
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块(严格地说不是表达式)也可以用上,它总是在try表达式执行完之后的某个时刻执行,不管是由有异常抛出。finally块经常用来做一些清理工作,而不管try代码是成功执行还是抛出异常。
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...
分享到:
相关推荐
C++后缀表达式转前缀表达式 C++程序中,后缀表达式转换为前缀表达式是一种常见的操作。为了完成这个操作,我们需要使用栈数据结构来存储和处理表达式中的操作符和操作数。 首先,让我们了解一下什么是后缀表达式和...
C语言版的等式表达式解析,不等式表达式解析,与或非逻辑运算表达式解析;支持带参数的表达式解析; 支持带函数的表达式解析。 1、支持 +、-、*、/、%、&&、||、!、>、<、>=、、==、!=、^(幂)、(、) 运算符 2、支持...
java版的等式表达式解析,不等式表达式解析,与或非逻辑运算表达式解析;支持带参数的表达式解析; 支持带函数的表达式解析。 1、支持 +、-、*、/、%、&&、||、!、>、<、>=、、==、!=、^(幂)、(、) 运算符 2、支持有...
在Quartz中,任务的调度通常通过一个叫做Cron Trigger的机制,它使用了一种特殊的表达式——Cron表达式,来定义任务的执行计划。 Cron表达式是由7个子表达式组成的字符串,每个子表达式都描述了一个单独的时间元素...
在编程领域,表达式解析是将输入的数学或逻辑表达式转换为计算机可理解的形式的过程。这个过程通常涉及构建表达式树,它是一种数据结构,能够直观地表示出表达式的结构。本文将深入探讨表达式树的建立及其在脚本解析...
在计算机科学中,表达式处理是一项基础且重要的任务。C++是一种强大且广泛应用的编程语言,它可以用来实现各种算法,包括解析和计算数学表达式。本篇将详细讲解如何使用C++来处理中缀表达式,并通过构建二叉树以及...
在计算机科学领域,数学表达式解析器是一种程序,它能够接收数学表达式的字符串形式,并将其转化为可执行的形式,以便计算出结果。在这个项目中,我们关注的是一个使用C/C++编程语言实现的数学表达式解析器,它基于...
将由数字和四则运算符组成的后缀表达式变换为中缀表达式。输入的后缀表达式包含的运算符不超过15个。要求转换后的中缀表达式中不应出现不必要的括号。例如,整个表达式两端的括号要省略,不影响原计算顺序的括号要...
在计算机科学领域,算术表达式的处理是一项基本任务,它涉及到如何存储、解析和求值这些表达式。这里,我们将深入探讨"算数表达式2_表达式二叉树_算数表达式求值_"这一主题,特别是通过二叉树结构来实现算术表达式的...
在C++编程中,实现一个数学表达式解析器是一项常见的任务,它允许程序处理和求解用户输入的数学表达式。本项目旨在提供一个简单易懂的C++计算器实现,支持括号和基本的四则运算(加、减、乘、除)。通过使用波兰...
在计算机科学领域,表达式求值是编程中的一个重要概念,特别是在数据结构和算法设计中。后缀表达式,又称逆波兰表示法,是一种方便计算的表达式表示方式,它消除了括号的使用,通过将操作符放置在操作数之后来简化...
1. **语法解析**:易语言中的表达式遵循一定的语法规则,例如,算术表达式、逻辑表达式等。解析器会根据这些规则将字符串形式的表达式转化为可执行的指令。 2. **运算符处理**:易语言支持常见的算术运算符(如+、-...
正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它用于匹配、查找、替换等操作,涉及字符串处理的各个领域。正则表达式转换工具是专门针对这一需求而设计的,它能帮助用户将输入的内容转换...
在本实验报告中,主要涉及的是中缀表达式与后缀表达式的转换以及求值问题。中缀表达式是我们常见的运算符位于操作数之间的表达形式,例如 `6+3*(6+5)`,而后缀表达式又称逆波兰表示法,其中运算符位于其操作数之后,...
本文将详细讨论如何使用C++实现数据结构中的一个重要概念——中缀表达式转化为后缀表达式,也被称为逆波兰表示法。这个过程涉及到堆栈这一重要的数据结构。 中缀表达式是我们日常生活中常见的数学表达式形式,例如 ...
在本项目中,“java堆栈的应用--中缀表达式转换成后缀表达式和计算”具体涉及到了两个主要知识点:中缀表达式的转换与后缀表达式的计算。 1. **中缀表达式**:这是我们常见的数学表达式形式,如 `2 + 3 * 4`,其中...
前缀表达式、中缀表达式和后缀表达式是编程中常见的三种表达式表示方法,它们在计算机程序设计和算法中扮演着重要的角色。中缀表达式是最常见的一种,例如在普通的算术运算中就广泛使用。而后缀表达式和前缀表达式则...
`cron`表达式源于Unix系统,用于定义周期性任务的调度,而在JavaScript环境中,我们通常使用第三方库来实现`cron`表达式的功能。 "Cron调度器"是一个工具,允许开发者创建和管理基于`cron`表达式的定时任务。这个...
(1) 从键盘或文件读入一个合法的算术表达式,输出相应的后缀表达式。后缀表达式中,数据与数据之间加分隔符; (2) 输出正确的计算结果,保留两位小数点; (3) 考虑算法的健壮性,当表达式错误时,要给出错误...
EL 表达式的使用详解 EL 表达式是一种在 Java 服务器页面(JSP)中使用的表达式语言。它提供了一种简单的方式来访问和操作 Java 对象的属性。EL 表达式广泛应用于 JSP、Servlet、JSF 等 Web 开发技术中。本文将详细...