ライフタイムとは
ダングリング参照を防ぎます
「ライフタイムとは」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
参照は有効なままでなければならない
参照は、自身が所有していないデータを借用します。Rustは、そのデータが少なくとも参照と同じ期間だけ存続することを保証する必要があります。ライフタイムは、コンパイラーがこれを追跡する仕組みです。
役割はダングリング参照を防ぐことです。
ダングリング参照とは
ダングリング参照は、解放済みのメモリを指す参照です。チェック機能のない言語では、これを使うとクラッシュやセキュリティバグの原因になります。Rustは、そのようなコードをコンパイルできないようにします。
借用チェッカーの動作
このコードは、スコープを外れる値への参照を作成してしまいます。Rustはコンパイル時にこれを拒否します。ライフタイムは、Rustが判断に使うルールです。
fn main() {
let r;
{
let x = 5;
r = &x;
println!("inside: {}", r);
}
// using r here would be a dangling reference
println!("done");
}スコープがライフタイムを定義する
値のライフタイムとは、その値が有効である期間で、通常はそのスコープです。参照は、それが指す値より長く存続してはなりません。
ここではxと参照が同じスコープに存在するため問題ありません。
fn main() {
let x = 5;
let r = &x;
println!("x is {}, r is {}", x, r);
}参照を返す
参照を返す関数は、呼び出し元にとって有効な参照を返さなければなりません。ローカル変数への参照は返せません。関数が終了すると、その変数も破棄されるからです。
入力値の借用を返す
できるのは、入力値から借用した参照を返すことです。結果は、その入力値が有効である限り有効です。これを正確に記述するのがライフタイム注釈です。
fn first_word(s: &str) -> &str {
let bytes = s.as_bytes();
for (i, &b) in bytes.iter().enumerate() {
if b == b' ' {
return &s[..i];
}
}
s
}
fn main() {
let sentence = String::from("hello world");
println!("{}", first_word(&sentence));
}ライフタイムはコンパイル時だけのもの
ライフタイムは純粋にコンパイル時の概念です。実行時コストは一切なく、借用チェッカーがメモリ安全性を検証できるようにするためだけに存在します。
所有権とライフタイム
所有権は値を解放する人を決め、ライフタイムはその値の借用がどれだけ長く存続できるかを決めます。これらにより、Rustはガベージコレクターなしで安全性を保証できます。
fn main() {
let data = vec![1, 2, 3];
let view = &data[0..2];
println!("{:?}", view);
// data still owns the vector; view just borrows part of it
println!("{:?}", data);
}シグネチャに名前が現れる理由
関数が複数の参照を受け取る場合、コンパイラーがそれらのライフタイムの関係を判断できないことがあります。その場合はライフタイム注釈を追加して、関係を明確にします。
次のレッスンでは、その構文を扱います。
得られる利点
ライフタイムにより、解放後使用、ダングリングポインター、イテレーターの無効化といったバグの一群全体が、そもそもコンパイルできなくなります。Cのような速度とメモリ安全性を得られます。
メンタルモデル
ライフタイムを、データが存続している期間に付けられたラベルだと考えてください。参照は「元のデータが存続している間だけ有効」という制約を持ちます。借用チェッカーがそれを強制します。
クイックチェック
ライフタイムが存在する理由についての理解度を確認しましょう。
まとめ
ライフタイムが存在する理由を学びました。
- 参照は、借用しているデータより長く存続してはならない
- ライフタイムはコンパイル時にダングリング参照を防ぐ
- ライフタイムはコンパイル時だけのもので、実行時コストはない
- 所有権と連携し、GCなしでメモリ安全性を実現する
よくある質問
「ライフタイムとは」レッスンは無料ですか?
はい。「ライフタイムとは」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「ライフタイムとは」で何を学びますか?
ダングリング参照を防ぎます ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「ライフタイムとは」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ライフタイムとは
- ライフタイム注釈
- 構造体内のライフタイム
- 省略規則