短路运算符和

用于分支

短路条件运算符 &&||可以用作以下结构的轻量级替换:

  • x && y 相当于 x ? y : x
  • x || y 相当于 x ? x : y

短路操作符的一种用途是作为一种更简洁的方式来测试条件并根据该条件执行特定操作。例如,如果参数 x 为负,则以下代码使用 && 运算符抛出错误:

function mysqrt(x)
    x < 0 && throw(DomainError("x is negative"))
    x ^ 0.5
end

所述||操作者也可用于错误检查,不同之处在于它触发误差*,除非*一个条件成立,而不是如果该条件成立:

function halve(x::Integer)
    iseven(x) || throw(DomainError("cannot halve an odd number"))
    x ÷ 2
end

另一个有用的应用是为对象提供默认值,只有先前没有定义它:

isdefined(:x) || (x = NEW_VALUE)

这里,检查是否定义了符号 x(即,是否存在分配给对象 x 的值)。如果是这样,那么什么都没发生但是,如果没有,那么 x 将被分配到 NEW_VALUE。请注意,此示例仅适用于顶级范围。

在条件

运算符也很有用,因为它们可用于测试两个条件,第二个条件仅根据第一个条件的结果进行评估。来自 Julia 文档

在表达式 a && b 中,仅当 a 评估为 true 时,才会评估子表达式 b

在表达式 a || b 中,仅当 a 评估为 false 时,才会评估子表达式 b

因此,如果 ab 都是 truea & ba && b 都将产生 true,如果 afalse,它们的行为是不同的。

例如,假设我们希望检查对象是否为正数,其中可能甚至不是数字。考虑这两个尝试的实现之间的差异:

CheckPositive1(x) = (typeof(x)<:Number) & (x > 0) ? true : false
CheckPositive2(x) = (typeof(x)<:Number) && (x > 0) ? true : false

CheckPositive1("a")
CheckPositive2("a")

如果将非数字类型作为参数提供给 CheckPositive1() 将产生错误。这是因为无论第一个表达式的结果如何,它都会计算两个表达式,而第二个表达式在尝试将其计算为非数字类型时会产生错误。

但是,如果提供非数字类型,则 CheckPositive2() 将产生 false(而不是错误),因为仅当第一个表达式为 true 时才计算第二个表达式。

不止一个短路运算符可以连接在一起。例如:

1 > 0 && 2 > 0 && 3 > 5