メインコンテンツにスキップ
モジュール 6 · レッスン 1 / 2コース内の 11/14~15 min
モジュールのレッスン (1/2)

存続期間と参照

Rust では、すべての参照には ライフタイム があり、これはその参照が有効なスコープに対応します。ほとんどの場合、ライフタイムは暗黙的に行われ、ライフタイム省略ルールのおかげでコンパイラによって推論されます。ただし、異なる参照の存続期間間の関係があいまいな場合は、それらに明示的に注釈を付ける必要があります。

ライフタイムの主な目的は、ダングリング参照 (すでにメモリから割り当てが解除されているデータへの参照) を防ぐことです。


ライフタイムアノテーションの構文

ライフタイム名はアポストロフィ (') で始まり、通常は短い小文字 ('a など) です。有効期間アノテーションは変数の実際の有効期間を変更しませんが、入力と出力の有効性の間の関係をコンパイラに示します。

たとえば、関数が 2 つの文字列参照パラメータを受け取り、文字列参照を返し、両方の入力パラメータが有効である限り、返された参照を有効にしたい場合は、次のように使用します。

Rust
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

データ構造の存続期間

構造体に参照であるフィールドが含まれている場合は、その参照の有効期間に明示的に注釈を付けて、構造体インスタンスが参照するデータよりも存続できないようにする必要があります。

Rust
struct ImportantExcerpt<'a> {
    part: &'a str,
}

fn main() {
    let novel = String::from("Call me Ishmael. Some years ago...");
    let first_sentence = novel.split('.').next().unwrap();
    let i = ImportantExcerpt {
        part: first_sentence,
    };
}

静的寿命

'static ライフタイムは、プログラムの期間全体にわたって続く特別なライフタイムです。すべての文字列リテラル (&str) は、バイナリ実行可能ファイル内に直接保存されるため、暗黙的に 'static の有効期間を持ちます。

Rust
let s: &'static str = "I have a static lifetime.";

自分で試してみてください

演習 1: 最長の関数

運動#rust.m6.l1.e1
試行回数: 0読み込み中…

&'a str 型の x と &'a str 型の y の 2 つのパラメータを受け入れ、&'a str 型の値を返す、longest<'a> という名前の関数を作成します。関数内で if/else ブロックを使用して、長さが y より大きい場合は x を返し、それ以外の場合は y を返します。

エディターを読み込み中…
ヒントを表示

`fn longest<'a>(x: &'a str, y: &'a str) -> &'a str` で署名を宣言します。次に、「if x.len() > y.len() { x } else { y }」を使用します。

3 回の試行後に解決策が利用可能になります

演習 2: 参照のある構造体

運動#rust.m6.l1.e2
試行回数: 0読み込み中…

&'a str 型の部分という名前の単一フィールドを含む Excerpt<'a> という名前の構造体を定義します。 main 関数で、text という名前の文字列変数を作成し、text への参照を借用して Excerpt 型の変数抜粋をインスタンス化します。抜粋部分を印刷します。

エディターを読み込み中…
ヒントを表示

`struct Excerpt<'a> {part: &'a str }`を使用します。 main では`Excerpt {part:&text }` でインスタンス化します。

3 回の試行後に解決策が利用可能になります

演習 3: 静的参照

運動#rust.m6.l1.e3
試行回数: 0読み込み中…

静的有効期間 (&'static str) の明示的な型アノテーションを使用して message という名前の変数を宣言し、それに文字列リテラルを割り当てます。メッセージの値を出力します。

エディターを読み込み中…
ヒントを表示

構文 `let message: &'static str = 'Messaggio statico!';` を使用して、静的有効期間に明示的に注釈を付けます。

3 回の試行後に解決策が利用可能になります