Sway 参考手册/条件语句
条件语句在计算机程序中实现决策点。假设你有一个对图像执行某些任务的程序。你可能在程序中有一个点,你在图像为 JPEG 时执行一件事,在图像为 GIF 文件时执行另一件事。很有可能,在这一点上,你的程序将包含一个条件表达式来做出这个决定。
在学习条件语句之前,了解逻辑表达式很重要。这样的表达式是条件语句和循环[1]的核心。
逻辑表达式求值为一个真值,本质上是真或假。例如,表达式 x > 0 如果 x 为正则求值为真,如果 x 为负或零则求值为假。在 Sway 中,真由符号 :true 表示,假由符号 :false 表示。这两个符号一起被称为 _布尔_ 值。
可以将真值赋给变量
var z = c > 0;
这里,如果 c 为正,则变量 z 的值为 :true;否则,它的值为 :false。
Sway 具有以下逻辑运算符。
== equal to >= greater than or equal to > greater than <= less than or equal to != not equal to && and || or
前五个运算符用于比较两件事,而最后两个运算符是将更简单的逻辑表达式连接成更复杂的逻辑表达式的粘合剂。
在计算逻辑表达式时,Sway 从左到右计算表达式,并在发现表达式绝对为真或绝对为假时停止计算。例如,遇到表达式
x != 0 && y/x > 2
如果 x 的值为 0,则 && 连接符左侧的子表达式将求值为假。此时,整个表达式不可能为真(因为 && 表达式要为真,左右两边都必须为真),因此不会计算表达式的右侧。请注意,此表达式可防止出现除以零错误。
在 Sway 中,有两种基本的结构用于在备选方案之间进行选择。它们是 if-then-else 语句和 switch(或 case)语句。
Sway 的 _if_ 表达式用于根据称为 _测试_ 表达式的真值有条件地执行代码。_if_ 的一个版本是在测试表达式后面有一个代码块
以下是一个示例
if (name == "John") { println("What a great name you have!"); }
在此版本中,如果测试表达式为真(即字符串“John”绑定到变量 _name_),则执行以下 _块_(即打印敬语)。如果测试表达式为假,则不会执行以下块。
与大多数编程语言不同,Sway 的 _if_ 是一个函数。在上面的示例中,两个参数是测试表达式和后面的块。后面的块被称为 _邻近_ 块。
这是 _if_ 的另一种形式
if (major == "Computer Science") { println("Smart choice!"); } else { println("Ever think about changing your major?"); }
在此版本中,_if_ 接受三个参数:测试表达式和两个后面的块[2]。如前所述,如果测试表达式为真,则计算第一个块。但是,如果测试表达式为假,则改为计算第二个块。
请注意,任何邻近参数必须是块。虽然以下内容在某些语言中是合法的,但在 Sway 中会生成语法错误
if (name == "John") println("What a great name you have!"); //not a block!
由于将单个表达式包装在块中可能被认为很乏味,因此你可以省略邻近块并对 _if_ 使用常规的函数调用语法
if (a < b,min = a,min = b); //find the minimum of two numbers
以上等效于
if (a < b) { min = a; } else { min = b; }
请注意,如果你将表达式移入作为常规参数,则需要在闭合括号后使用分号,就像任何其他函数调用一样。
函数 _if_ 与 Sway 中的任何其他函数一样具有返回值。实际上,你可以使用返回值来简化上面的表达式
min = if (a < b) { a; } else { b; };
或
min = if (a < b,a,b);
如果你使用 if 的返回值,则必须在表达式末尾使用分号,无论你是否使用邻近块。
请记住,如果你单独使用 _if_ 且 if 具有邻近块,则不要在表达式末尾使用分号。否则,在包含 _if_ 的整个表达式末尾需要使用分号。
你可以将 _if 表达式_ 连接在一起,如下所示
if (bases == 4) { println("HOME RUN!!!"); } else if (bases == 3) { println("Triple!!"); } else if (bases == 2) { println("double!"); } else if (bases == 1) { println("single"); } else { println("out"); }
如前所述,最终计算的块的值是整个结构的返回值。如果没有计算任何块,则返回值为 :false。
连接的 _if_ 与一系列非连接的 _if_ 之间有什么区别?例如,
if (bases == 4) { println("HOME RUN!!!"); } if (bases == 3) { println("Triple!!"); } if (bases == 2) { println("double!"); } if (bases == 1) { println("single"); } else { println("out"); }
答案留给读者作为练习。
上面的 if 链可以使用 _switch_ 表达式改写
var x = 0; switch (x) { case(4) { println(x,"HOME RUN!!!"); } case(3) { println("Triple!!"); } case(2) { println("double!"); } case(1) { println("single"); } else { println("out"); } }
如果 switch 表达式(在本例中为 _x_)与任何 case 表达式(在本例中为 4、3、2 和 1)匹配,则计算与匹配的 case 相对应的块。
在像 C 这样的语言中,switch 语句比等效的 if 链更有效。在 Sway 中,并非如此。实际上,switch 的效率(不)相当,但通常看起来更令人赏心悦目。与要求 switch 和 case 表达式为整数并在编译时已知的 C 不同,Sway 的 switch 更加灵活,因为两种表达式都可以是任何有效的 Sway 表达式,包括变量。
要使用 _switch_,你需要包含 _**basics**_ 库。要使用“basics”库,请在源代码文件顶部添加以下函数调用
include("basics");
在源代码文件的顶部。
与 _if_ 一样,switch 也是一个具有邻近块参数的函数。本身,带有邻近块的 switch 调用没有终止分号。与 _if_ 一样,switch 也是一个具有邻近块参数的函数。本身,带有邻近块的 switch 调用没有终止分号。在所有其他情况下,需要使用分号。