Namaran

Code daily. Without assist.

2026-09-07

ref_eq.rs

fn main() {
    let a = 5;
    let b = 5;
    let ra = &a;
    let rb = &b;
    println!("{}", ra == rb);
}

これは何を出力するでしょうか?

Answer

truerarbは別々の変数abを指す別々の参照なので、アドレスとしては異なります。しかし&i32同士の==PartialEqの実装により自動的に中身を参照解決(deref)してから比較するので、比較されているのは実際にはアドレスではなく値の5 == 5です。C言語のポインタ比較(pa == pbはアドレスを比較し、別変数を指していればほぼ確実にfalse)に慣れていると意外に感じる挙動です。アドレスそのものを比較したい場合はstd::ptr::eq(ra, rb)を使う必要があり、その場合の結果はfalseになります。