2026-09-07
make_message.rs
fn make_message() -> &String {
let s = String::from("hi");
&s
}
fn main() {
let m = make_message();
println!("{}", m);
}
make_messageはコンパイルできません。何が問題で、どう直せばよいでしょうか?
Answer
sはmake_messageの中だけで生きるローカル変数で、関数が戻ると同時に破棄されます。&sとして参照を返そうとしても、その参照先はもう存在しないので、借用チェッカーがコンパイル時に拒否します(Cならこれは黙って通り、ダングリングポインタとして実行時に牙を剥く未定義動作になっていたところです)。最小限の修正は、参照ではなく所有権ごと値を返すことです:
fn make_message() -> String {
let s = String::from("hi");
s
}