LoginSignup
3
1

More than 5 years have passed since last update.

Rust の論理積の & は短絡評価じゃなかった

Posted at

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'

なんでやねん?

要するに短絡評価じゃなくて左右の項を両方評価する,ということらしい。

&&& に変えると,これは短絡評価なので期待どおりに動作した。

いろいろなドキュメントを見てみたけど,&& が短絡評価であることや,整数で & がビットごとの論理積であることは書いてるのに,論理値の & が短絡評価でないことは見つけられなかった。うーむ。

3
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1