PCガジェットはいつでも安いAmazonで!

Rustのfor文でiter()を使ったあとif文を使うとリテラルの条件がエラーになる話

HP新生活大祭り 2026

icon icon
目次

はじめに

今回からプログラミング言語のRustの話を始めます。

だんだん新しい言語としてRustの採用が広まってきています。

私も勉強してみようと思いました。

練習したことの備忘録を残して、自分や初学者の方の参考になるような情報を目指します。

RustはPythonとは違って、かなり厳密な言語です。

Pythonなら簡単に書けるコードも、Rustだと色々考えないと動かない印象ですね。

その分エラーとかバグが少なくなるんでしょうけどね。

少しずつ覚えていこうと思います。

今回の問題

5つの数値:1, 4, 2, 7, 3

のうち3より大きい値を合計した値を求めよ。

答えは11です。

これをRustのプログラムにします。

Pythonの感覚でやりがちな間違い

次のコードはエラーになります。

fn main(){
    let a = [1,4,2,7,3];
    let mut sum = 0;
    for t in a.iter() {
        if t > 3 {
            sum += t;
        }
    }
    println!("Result is : {}", sum);
}

○エラー内容

expected reference, found integer help: consider borrowing here: `&3`

note: expected reference `&_` found type `{integer}`

○解説

要するに「t > 3」の部分のtが参照型なのに3がリテラルだから型が合わないよ、ということです。

○正しいコード

fn main(){
    let a = [1,4,2,7,3];
    let mut sum = 0;
    for t in a.iter() {
        if *t > 3 {
            sum += t;
        }
    }
    println!("Result is : {}", sum);
}

○出力

Result is : 11

○改良点

tを*tに変えただけ。

解説

for文の中でif文を書くと、条件式の部分のiter()の変数が参照型になる模様。だからどちらかをどちらかの型に合わせないといけない。

コンパイラは「&3」にせよ、と言っている。

つまりtが参照型なら3も参照型にしなさいという話。

なんかリテラルを参照型にわざわざするのは気持ち悪いので、tをリテラルに直してみた。

Rustでは変数の前に「*」を付ければ、その変数の値そのものにアクセスできる。

つまりtをリテラルの3に合わせたという話。

おわかりかもしれないが、

sum += t;

の部分は普通にtの値にアクセスできているので、for文の中でif文を使ったときの条件式の処理の仕方が独特なんだと思う。

条件式では参照型として扱い、本文の中身では値そのものにアクセスできる模様。

iter()を使わずに普通に配列にアクセスする次のコードはエラーにならない。

    for i in 0..5 {
        if a[i] > 3 {
            sum += a[i];
        }
    }

このとき条件式ではa[i]が値にアクセスできている。

iter()で取り出した値を条件式に持ってくると参照型になるみたい。

まとめ

今回は

expected reference, found integer help: consider borrowing here: `&3`

note: expected reference `&_` found type `{integer}`

のエラーが出たときの一つの解決法について書きました。

目次