はじめに
NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる
- ちょっと今日は遅くなってしまったのでミニマルでやる
前回の振り返り
- ブランケット実装をメインでやった
- トレイト境界で複数トレイト指定した後に条件が合えばimplできる仕組みだった
今日読む場所
お勉強
メモ
- ライフタイムをやる
第4章の「参照と借用」節で議論しなかった詳細の一つに、Rustにおいて参照は全てライフタイムを保持するということがあります。 ライフタイムとは、その参照が有効になるスコープのことです
- これはRustを学ぼうとしたときに良くでてきたなーという印象
- 変数に寿命があるやつ
コンパイラは、ジェネリックライフタイム引数を使用して関係を注釈し、実行時に実際の参照が確かに有効であることを保証することを要求するのです。
-
これは別に普通の引数でもそうなのでは?と思った
ライフタイムの主な目的は、ダングリング参照を回避することです。
- dockerでも参照できないimageがあるとダングリングとかいうって聞いた
fn main() {
{
let r;
{
let x = 5;
r = &x;
}
println!("r: {}", r);
}
}
- これはrにxが借用されて代入されるから、{}]を抜けたらxが消えてrは残るイメージ
$ cargo run
Compiling chapter10 v0.1.0 (file:///projects/chapter10)
error[E0597]: `x` does not live long enough
(エラー[E0597]: `x`の生存期間が短すぎます)
--> src/main.rs:7:17
|
7 | r = &x;
| ^^ borrowed value does not live long enough
| (借用された値の生存期間が短すぎます)
8 | }
| - `x` dropped here while still borrowed
| (`x`は借用されている間にここでドロップされました)
9 |
10 | println!("r: {}", r);
| - borrow later used here
| (その後、借用はここで使われています)
error: aborting due to previous error
For more information about this error, try `rustc --explain E0597`.
error: could not compile `chapter10`.
To learn more, run the command again with --verbose.
変数xの「生存期間が短すぎます」。原因は、内側のスコープが7行目で終わった時点でxがスコープを抜けるからです。 ですが、rはまだ、外側のスコープに対して有効です;
- なにー!なんか間違えたな
Rustコンパイラには、スコープを比較して全ての借用が有効であるかを決定する借用チェッカーがあります
- へぇ~~
- ということはx.clone()とかすれば通ったのかな?
- geminiに聞いたら通るっぽい、解釈一緒で良かった
まとめ
- ライフタイムの復習をした
- 記述方法は忘れていたが、理解はしていた