Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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'

なんでやねん?

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

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away