🦀

関数で文字列を返すときは &str じゃなく、 String を使え

2022/07/11に公開

発端

Rust を学び始めて、どのコードを見ても戻り値に文字列を扱うときは、 String を使っている。 Rustを完全に理解したレベルの僕には、 &str を返したほうがいいじゃないかと思った。

結果

&str だと関数から抜けるときに確保したメモリが開放されるので、String を使うのがよい。

fn main() {
    println!("{}", hello_world1());
    //println!("{}", hello_world2()); // expected named lifetime parameter 発生
    println!("{}", hello_world3());
}

fn hello_world1() -> String {
    return "Hello world1".to_string();
}

// fn hello_world2() -> &str {
//     return "Hello world2";
// }

fn hello_world3() -> &'static str {
    return "Hello world3";
}

Playground

補足

&'static str で定義すればできるけど、メモリの確保のされ方がかわるみたい

static なライフサイクルを持つ変数

公式ドキュメントには以下のように書かれている。
スタティックライフサイクルにすることでプログラムが実行されている間メモリを確保してくれるようになるようでした。文字列を返すためにプログラムが実行されている間無駄にメモリを確保する必要もないと思うのでよっぽどのことがない限り、 &'static str のような記述はふようなんじゃないだろうか。

原文

As a reference lifetime 'static indicates that the data pointed to by the reference lives for the entire lifetime of the running program. It can still be coerced to a shorter lifetime.

Discussion