多くのプログラミング言語では、論理演算は短絡評価されます。Kotlinの文法であれば、 a && b
で a
がfalseであれば b
は評価されず、 a || b
で a
がtrueであれば b
は評価されないということです(無駄なので)。
これを利用して、ハック的なコードを書くことが可能です。
わかりやすい例を提示します。以下のコードでは、 someBool()
がtrueを返した時は some()
のブロック内の処理は短絡評価されるため、 doSomething()
は評価されません。一方、 someBool()
がfalseを返した時は doSomething()
が評価されます。
fun some() {
someBool() || doSomething()
}
fun someBool(): Boolean = Random.nextBoolean()
fun doSomething(): Boolean {
println("do something here")
return true
}
この &&
||
の短絡評価を利用すると、 someBool()
がtrue / falseの時にだけ特定の処理を行う、という処理を書くことができるわけですが、あまり行儀が良くないので1、基本的にはやめましょう。
今回の例はまだわかりやすいですが、 if (someCondition() || anotherCondition()) {}
のように、 if
の条件式内で何らかの副作用が発生するような短絡評価の乱用は、厳に慎むべきでしょう。
Kotlinには、 and
演算子と or
演算子が存在します。これらの演算子はそれぞれ &&
演算子と ||
演算子と似ていますが、 and
演算子と or
演算子は短絡評価されず、完全評価されます。すなわち、演算子の左側の値がtrueだろうがfalseだろうが、右側の値も評価される、ということです。
こちらはこちらで、無駄に処理が行われてしまうことにつながるため、注意が必要です。
個人の見解です。 ↩︎