From 2aadbb6d3aaf8619d72de23a5eac9c4b52e00805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B5=87=E1=B5=92?= <40080007@qq.com> Date: Sat, 11 May 2024 11:51:01 +0800 Subject: [PATCH] feat: short circuit bitwise(or/and) --- _posts/2024-05-11-short-circuit-bitwise.md | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 _posts/2024-05-11-short-circuit-bitwise.md diff --git a/_posts/2024-05-11-short-circuit-bitwise.md b/_posts/2024-05-11-short-circuit-bitwise.md new file mode 100644 index 0000000..69af932 --- /dev/null +++ b/_posts/2024-05-11-short-circuit-bitwise.md @@ -0,0 +1,28 @@ +--- +layout: post +title: 短路逻辑或/与 +date: 2024-05-11 11:30:00 +0800 +categories: bitwise +tags: bitwise +published: true +--- + +* content +{:toc} + +今天写了如下一段 kotlin 代码: + +```kotlin +fun foo(uid: Int, list: List): Boolean = list.isEmpty() or ((list.size == 1) and (list[0] == uid)) +``` + +这段代码意图传入一个用户 id 列表和一个用户 id,如果列表为空、或者列表只包含指定的用户 id,则返回 true,否则返回 false。 + +很简单的一段代码,但是在某些场景下崩了。复现和解决也不难,原因是列表为空时,后面的或逻辑会继续执行,导致数组越界异常。
+我原本以为 or 和 and 是短路逻辑,看了下源码才发现这两并不是短路的。仔细想想 kotlin 的 or、and 是中缀操作符,其本质上是一个函数,操作符后面的表达式只是该函数的一个参数,自然也就明白为什么不是短路的了。 + +解决方式很简单,换成短路逻辑运算符 `|| &&` 即可: + +```kotlin +fun foo(uid: Int, list: List): Boolean = list.isEmpty() || (list.size == 1 && list[0] == uid) +``` \ No newline at end of file