目次

Rustの勉強[ライフタイム その3]

(更新: )ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる

  • 昨日は寝落ちしてしてサボってしまった
  • なので今日は休みなのでずっとやりたかったblogを改修した
    • HonoX + bun + vite + vitest
    • 本当にvibe 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と書いているのになぜか借用のデータを元に生み出したもののアドレスを返そうとしている
    • 辻褄が合わなさすぎて混乱していた
  • すっきりした

まとめ

#