条件命令

84 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 "结束"
}