持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第44天,点击查看活动详情
条件命令
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 "结束"
}