2026-09-07
ref_eq.rs
fn main() {
let a = 5;
let b = 5;
let ra = &a;
let rb = &b;
println!("{}", ra == rb);
}
これは何を出力するでしょうか?
Answer
true。raとrbは別々の変数a・bを指す別々の参照なので、アドレスとしては異なります。しかし&i32同士の==はPartialEqの実装により自動的に中身を参照解決(deref)してから比較するので、比較されているのは実際にはアドレスではなく値の5 == 5です。C言語のポインタ比較(pa == pbはアドレスを比較し、別変数を指していればほぼ確実にfalse)に慣れていると意外に感じる挙動です。アドレスそのものを比較したい場合はstd::ptr::eq(ra, rb)を使う必要があり、その場合の結果はfalseになります。