human
私は今数週間錆びを学んでおり、フィズバズの問題に手をかけようとしています。

コード：
fn fizzbuzz <'a>（n：usize） - >＆' a str {
一致（n％3、n％5）{
（0、0）=> "fizzbuzz"、
（0、_）=>「フィズ」、
（_、0）=>「バズ」、
_ => n.to_string（）。as_str（）、
}
}

何らかの理由で、私は理解するのに苦労しているコンパイラエラーを取得します。

エラー：
エラー[E0515]：一時的な値を参照する値を返すことができません
   - > src \ main.rs：36：2
   |
36 |/ match（n％3、n％5）{
37 ||（0、0）=> "fizzbuzz"、
38 ||（0、_）=>「フィズ」、
39 ||（_、0）=>「バズ」、
40 ||_ => n.to_string（）。as_str（）、
   ||------------ここで作成された一時的な値
41 ||}
   || _____^現在の関数が所有するデータを参照する値を返します

このエラーの詳細については、 `rustc -explain e0515`をお試しください。

なぜこれが起こるのか、どのように修正できるのかを説明していただけますか？
gpt
はい、その通りです！あなたが遭遇している問題は、文字列リテラル "fizzbuzz"、"fizz"、"buzz "が一時的な値であり、それらへの参照を返そうとしているからです。

このエラーは、&strの代わりに&'static strを返すことで解決できます。&'static strは文字列リテラルのことで、「静的な寿命」、つまりプログラムの間だけ有効です。以下は、あなたのコードを更新したものです：

```
fn fizzbuzz(n: usize) -> &'static str {
    match (n % 3, n % 5) {
        (0, 0) => "fizzbuzz",
        (0, _) => "fizz",
        (_, 0) => "buzz",
        _ => {
            let s = n.to_string();
            Box::leak(s.into_boxed_str())
        }
    }
}
```

最後のアームは、Box::leak関数を使用してStringから作成された&'static strを返すことに注意してください。Box::leak関数は、Box<T>の所有権を取得し、その内容へのポインタを返し、効果的にリークします。この関数はBox<T>の所有権を取得し、その内容へのポインタを返すので、事実上リークすることになる。返されたポインタはプログラムの間ずっと続くので安全だが、自動的にクリーンアップされるわけではないので、使用には注意が必要だ。
human
どうやって