条件命令
if,elseif,else命令
IF将表达式作为参数,并计算该表达式为TRUE或FALSE。如果为true,则执行表达式后面的代码块;如果为false,则不执行该代码块。通常用值1和0表示这些值。但是,Caché对值执行条件执行,如果其计算结果为0(零),则将其计算为false,如果计算结果为非零值,则计算为True。
IF结构允许计算多个条件,并指定根据这些条件运行哪些代码。与简单命令相反,构造由一个或多个命令关键字、它们的条件表达式和代码块组成。IF结构由以下部分组成:
- 一个带有一个或多个条件表达式的if子句。
- 任意数量的ELSEIF子句,每个子句都有一个或多个条件表达式。ELSEIF子句是可选的;可以有多个ELSEIF子句。
- 最多只有一个ELSE子句。没有条件表达式,ELSE子句是可选的。
ClassMethod IF(str) { if str = 1 { w "str = 1" } elseif str = 2 { w "str = 2" } elseif str = 3 { w "str = 3" } elseif str = 4 { w "str = 4" } else { w "str = 其他" } } 复制代码
传统的IF命令是面向行的。要执行的命令必须在同一程序行中跟随它。不使用花括号,并且行格式是固定的。新的IF命令是块结构的;它执行的块由在IF命令后的花括号内找到的命令组成。行格式(空格,换行符)没有限制。 IF的新版本不使用$TEST特殊变量。
ClassMethod IF6() { s x = 1 i x = 1 w "走了if " d Sub1(x) e w "同时也走了else " d Sub2(x) q Sub1(y) i y = 2 w "走了Sub1 ",! q Sub2(z) w "走了Sub2 ",! q } 复制代码
注意:该面向行的点语法ELSE关键字可以缩写为E。(不能缩写为面向块的新型ELSE关键字。)IF和ELSE的新旧形式在语法上是不同的,不应结合使用;因此,一种类型的IF不应与另一种类型的ELSE配对。
/// d ##class(YX.M18).IF1(1) ClassMethod IF1(str) { if str = 1 { w "str = 1" } else { w "str = 其他" } if str = 1 d .w "str = 1" e d .w "str = 其他" } 复制代码
IF中使用QUIT
如果在IF代码块(或ELSEIF代码块或ELSE代码块)中遇到QUIT命令,则QUIT的用法与直接QUIT命令相同,可视为该代码块不存在一样。此用法不同于任何其他类型的大括号代码块内的退出(For、While、Do...While、Try或Catch)。
- 如果IF代码块未嵌套在循环结构中,或未嵌套在TRY或CATCH块中,则QUIT退出当前例程。
ClassMethod IF2() { s y = $random(10) if y # 2 = 0 { w y," 偶数",! q w "偶数,此处永远不会被执行" } else { w y, " 奇数",! q w "奇数,此处永远不会被执行" } w "此处永远不会被执行" } 复制代码
- 如果IF代码块嵌套在循环结构(如FOR代码块)中,则QUIT退出循环结构块,并继续执行循环结构代码块后面的命令。
ClassMethod IF3() { for x = 1 : 1 : 8 { if x # 2 = 0 { w x," 偶数",! q:x=4 } else { w x," 奇数",! } } WRITE "循环执行完毕",! q "结束" } 复制代码
- 如果IF代码块位于TRY块或CATCH块内,则QUIT将退出TRY或CATCH块,并继续执行TRY或CATCH块后面的命令。
ClassMethod IF4() { try { s y = $random(10) if y # 2 = 0 { w y," 偶数",! q w "偶数,此处永远不会被执行" } else { w y, " 奇数",! q w "奇数,此处永远不会被执行" } w "此处永远不会被执行" } catch exp1 { w "仅在发生错误时写入",! w "Error Name: ",$zcvt(exp1.Name,"O","HTML"),! } try { w "转到下一个TRY块",! } catch exp2 { w "仅在发生错误时写入",! w "Error Name: ",$zcvt(exp2.Name,"O","HTML"),! } q "结束" }