#Rust
以下の関数について。
```rust
fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &str {
```
[[戻り値型]]の[[ライフタイム引数]]は`'a`か`'b`のいずれかでなければいけない。つまり
```rust
fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &'a str {
```
または
```rust
fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &'b str {
```
である必要がある。
## 理由
引数以外の[[参照]]を返却する場合、関数内で新たな[[参照]]を生成する必要がある。しかし、それらは関数の終わりにスコープを抜けるので確実に[[ダングリング参照]]になり、利用できない。
```rust
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() {
let s1 = "hoge";
s1 // ここでs1は終了
} else {
let s2 = "hoge";
s2 // ここでs2は終了
}
}
```
そのため、返せる[[参照]]は引数として渡された`x`または`y`のみとなる。