Julia中用短路运算替代if分支的代码风格与性能咨询
Julia短路运算做前置校验的相关说明
风格共识结论
你提到的用||短路运算做前置参数校验的写法,不属于主流Julia风格指南中不推荐的场景,和Blue风格指南不推荐使用Unicode ∈符号的情况有本质区别:
- Blue风格指南不推荐
∈的核心原因有两点:一是部分老旧终端、编辑器对Unicode符号的渲染支持差,容易出现乱码;二是对Julia新手不够友好,很多刚接触语言的用户不知道如何输入该符号,存在不必要的阅读门槛。而||、&&是Julia语法层面原生支持的基础运算符,不存在输入、渲染的兼容性问题,所有具备Julia基础的开发者都能快速读懂语义。 - 你观察到第三方开源包中这类写法普及率不高,纯粹是开发者使用习惯差异导致的,并非风格禁忌。实际上Julia官方Base库本身就大量使用这种写法做前置参数校验,是官方代码中非常常见的编码范式,只是很多第三方包开发者习惯了if块的写法,没有特意换用短路写法而已。
- 这类写法唯一需要注意的使用边界:不要把逻辑复杂、行数较多的分支逻辑放在短路运算符的右侧,这类场景下if块的可读性会明显更高;如果只是单行抛错、提前返回这类简单逻辑,用短路写法完全不存在可读性问题,你个人偏好这种简洁形式可以放心使用。
两种写法的对比如下:
短路写法示例:
function foo(x) x isa Bar || throw(ArgumentError("x is not a Bar...")) dosomething(x) end
传统if块写法示例:
function foo(x) if !(x isa Bar) throw(ArgumentError("x is not a Bar...")) end dosomething(x) end
注:上述短路写法在功能上和!(x isa Bar) && throw(...)的形式完全等价。
性能表现结论
两种写法不存在任何性能差异:
Julia编译器在优化阶段会将两种写法生成完全一致的中间表示与机器码,不会出现谁多执行操作的情况,你从逻辑层面判断二者执行步骤基本一致的结论是完全正确的。所谓短路运算会带来额外性能开销的说法没有实际依据,不管选择哪种写法,运行效率都没有区别,不需要在性能层面做取舍。
内容的提问来源于stack exchange,提问作者DistortedASD
相关产品推荐
相关产品推荐

