2026-09-16
shout.rs
fn shout(message: String) -> String {
message.to_uppercase()
}
fn main() {
let greeting = String::from("hello");
let shouted = shout(greeting);
println!("{greeting} -> {shouted}");
}
これはコンパイルできません。何が問題で、どう直せばよいでしょうか?
Answer
仮引数message: Stringは所有権を受け取る型なので、呼び出しshout(greeting)は実引数greetingの所有権をshoutへムーブします。ムーブしたあとのgreetingは無効なので、続くprintln!での参照はコンパイルエラーです。shoutは文字列の中身を読むだけで所有権は要らないので、仮引数を借用&strに変えれば、実引数側は借用を渡すだけで所有権を手放さずに済みます:
fn shout(message: &str) -> String {
message.to_uppercase()
}
fn main() {
let greeting = String::from("hello");
let shouted = shout(&greeting);
println!("{greeting} -> {shouted}");
}