Rust ド素人がけつまずいたはなし。
Rust の何かのドキュメントを見てたら
true & false
が false
になる,という話が書いてあって,
Rust って論理演算の AND は
&&
じゃなくて&
と書くのか,へー。
と派手に勘違いした。
で,自分のコードを書いているとき,とくに迷うこともなく,こんな感じの書き方をしてしまった。
let v = vec![1, 2, 3];
let i = 7;
let b = (i < 3) & (v[i] > 2);
(実際のコードとは違うけど,けつまづいた点を再現)
要するに,i
の値がベクター v
のインデックスとして妥当な範囲かを確認したうえで v[i]
の値を見ようとした。
そしたらパニック!
panicked at 'index out of bounds: the len is 3 but the index is 7'
なんでやねん?
要するに短絡評価じゃなくて左右の項を両方評価する,ということらしい。
&
を &&
に変えると,これは短絡評価なので期待どおりに動作した。
いろいろなドキュメントを見てみたけど,&&
が短絡評価であることや,整数で &
がビットごとの論理積であることは書いてるのに,論理値の &
が短絡評価でないことは見つけられなかった。うーむ。