Namaran

Code daily. Without assist.

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}");
}