str::replace()
は新しい String
を返しますので、以下のようにしか書けません。
rust
1fn replace_space(s: &str) -> String {
2 s.replace(" ", "%20")
3}
元のコードで &str
を返せない理由ですが、関数を抜ける時に str::replace()
が返してきた String
の寿命が尽きるからです。コード中のコメントを参照してください。(説明しやすいようにコードを少し変形しました)
rust
1fn replace_space(s: &str) -> &str {
2 let s1 = s.replace(" ", "%20"); // 新しい `String` が作られ変数 `s1` に束縛される。
3 &s1 // `String` を参照する `&str`(文字列スライス)を作って返す。
4} // ここで変数 `s1` がスコープを抜けるので `String` が解放される。
5 // すると、文字列スライスは解放済みのメモリを指す無効なポインタになってしまう。
6 // Rust コンパイラはこの問題を検出し、コンパイルエラーにする。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。