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'
なんでやねん?
要するに短絡評価じゃなくて左右の項を両方評価する,ということらしい。
& を && に変えると,これは短絡評価なので期待どおりに動作した。
いろいろなドキュメントを見てみたけど,&& が短絡評価であることや,整数で & がビットごとの論理積であることは書いてるのに,論理値の & が短絡評価でないことは見つけられなかった。うーむ。