5.2 判断逻辑
在实际的业务逻辑中,常需根据不同的情况作出判断,并选择对应的分支以执行不同的处理过程,让程序适应场景的变化。这是判断逻辑(Conditional Evaluation)的经典功能。
在Julia中,关键字if、elseif、else和end组成了判断逻辑的主要结构,基本语法为:
if 条件表达式1 # 实现体 elseif 条件表达式2 # 实现体 elseif 条件表达式3 # 实现体 else # 实现体 end
其中,“条件表达式”不需要像C++语言那样使用括号界定,只需用空格与if、elseif这两个关键字隔开即可。不过,条件表达式一定要是能够返回布尔型结果的逻辑运算。
提示 结构中的if是必需的,且只能出现一次;else可以不出现但若出现则只能一次;而elseif可多次使用,但需在if之后、else之前。
实际上,每个关键字(除end之外)之后的语句块均可视为复合表达式,都可以有自己的返回值,例如:
julia> if 3 > 0 || 2 > 0 && !(0 > 3) 2 else -2 end 2 julia> if x > 0 "positive!" else "negative..." end "positive!" julia> z = if 3 < 0 10 else -10 end -10
Julia中的数值本身同样可以构成独立的语句,也同样是表达式,所以也是其所处复合表达式的子表达式。当一个数值或变量处于复合表达式的最后时(如上例所示),其便是该复合表达式的返回值。
在判断逻辑的运行过程中,程序会按需对if与elseif的逻辑条件进行判断,如果表达式为true,则会进入对应的语句块执行,执行完成后便会直接返回其中复合表达式的结果,不再执行结构中的其他语句,即if或elseif构成的多个语句块中只有一个会被执行。例如:
julia> if 3 > 0 # 条件为true, 3 # 运行返回 elseif 2 > 0 # 条件为true, 2 # 但不会运行 end 3 julia> if 0 > 3 # 条件为false, 0 # 不会运行 elseif 3 > 0 # 条件为true, 3 # 运行返回 elseif 2 > 0 # 条件为true, 2 # 但不会运行 else nothing end 3
需要注意的是,在为if或elseif提供条件表达式时,是不支持将1或0这种整型值直接作为true或false使用的,若那样做会直接报错,例如:
julia> if 1 println("true") end ERROR: TypeError: non-boolean (Int64) used in boolean context julia> if !0 println("this is error") end ERROR: MethodError: no method matching !(::Int64)
在Julia中,1或0与true或false是完全不同的类型,不能混用,下文介绍的循环结构中同样如此。
对于语句简单或表达式并不复杂的情况,可使用三元运算符?:实现判断逻辑。例如,在表达式a?b:c(注意各符号之间有空格)中a是条件表达式,值为true时该三元运算符返回b值,否则返回c值。例如:
julia> x=3; x>10 ? true : false # x为3,所以>10不成立,返回第二个值false false julia> 3>0 ? 3 : 0 3 julia> false ? 3 : 0 0
需要注意的是,在v1.0版的Julia中,符号?及:的前后都需要有空格,否则会报错。
此外,这种简单的逻辑判断,还可以考虑使用内置的ifelse()函数,其原型为:
ifelse(condition::Bool, x, y)
当condition为true时返回x,否则返回y值。例如:
julia> ifelse(1>0,1,0) 1 julia> ifelse(1<0,1,0) 0
函数ifelse()可实现if结构或?:类似的功能,但本质却是不同的。很多时候使用ifelse()函数代替if结构能够消除过多的逻辑分支,生成更为高效的代码。