はじめに
NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる
- 昨日は寝落ちしてしてサボってしまった
- なので今日は休みなのでずっとやりたかったblogを改修した
- HonoX + bun + vite + vitest
- 本当にbibe codingしたので中身なにもわかっていない
- が、作りたいものは5hぐらいで作れたのでこれからゆっくりソースは読んでいく
- TSのお勉強はこれで細々しよう
前回の振り返り
- ライフタイムの復習
- なぜ今これをやるのかを次にやる
今日読む場所
NO IMAGEライフタイムで参照を検証する - The Rust Programming Language 日本語版
お勉強
メモ
fn longest<'a>(x: &'a str, y: &str) -> &'a str {
x
}
この例では、引数xと戻り値に対してライフタイム引数'aを指定しましたが、引数yには指定していません。 yのライフタイムはxや戻り値のライフタイムとは何の関係もないからです。
- fmfm
fn longest<'a>(x: &str, y: &str) -> &'a str {
// 本当に長い文字列
let result = String::from("really long string");
result.as_str()
}
ここでは、たとえ、戻り値型にライフタイム引数'aを指定していても、戻り値のライフタイムは、 引数のライフタイムと全く関係がないので、この実装はコンパイルできないでしょう。 こちらが、得られるエラーメッセージです:
$ cargo run
Compiling chapter10 v0.1.0 (file:///projects/chapter10)
error[E0515]: cannot return value referencing local variable `result`
(エラー[E0515]: ローカル変数`result`を参照している値は返せません)
--> src/main.rs:11:5
|
11 | result.as_str()
| ------^^^^^^^^^
| |
| returns a value referencing data owned by the current function
| `result` is borrowed here
| (現在の関数に所有されているデータを参照する値を返しています
| `result`はここで借用されています)
error: aborting due to previous error
For more information about this error, try `rustc --explain E0515`.
error: could not compile `chapter10`.
To learn more, run the command again with --verbose.
- 笑えるぐらいわからんw
- 多分意味がわかっていない
問題は、resultがlongest関数の末端でスコープを抜け、片付けられてしまうことです。 かつ、関数からresultへの参照を返そうともしています。
- この辺の話かな
- 読み解いていこう
- んー??
- これってmoveしないの?って思った
今回の場合、最善の修正案は、 (呼び出し先ではなく)呼び出し元の関数に値の片付けをさせるために、参照ではなく所有されたデータ型を返すことでしょう。
- あーだめだ、今日全然わからんw
- geminiに聞くか
このコードがコンパイルできない理由は、**「moveしようとしているのに、関数の戻り値の型が『参照(&str)』になっているから」**という点にあります。
- ナルホドーーーーーーーーーーー
- moveする認識はあっていたが、型定義の認識が甘かった
もし、あなたが直感された通りに「move」させたいのであれば、戻り値の型を &str(参照)から String(所有権)に変える必要があります。
- そうだよね
- んーだけど逆に
&strが返せるパターンがわかってないな - あーーーーーー意味が理解できた
- この問題はそもそも意味不明な記述をしていた
- なぜなら借用で渡しているのはアドレスだから
- で、借用のstrを返したいので&strと書いているのになぜか借用のデータを元に埋みだしたもののアドレスを返そうとしている
- 辻褄が合わなさすぎて混乱していた
- すっきりした
まとめ
- 引き続きライフタイム自体は理解してたっぽい
- が、記述が意味不明すぎて理解ができなかった
- 蓋を開けたら借用を返してるのに中身はmoveしなきゃいけない変数だった
- それが意味不明な記述で理解できてなかっただけだった
- 次はここ
https://doc.rust-jp.rs/book-ja/ch10-03-lifetime-syntax.html#構造体定義のライフタイム注釈