0Pricing
Learn Rust Coding · レッスン

ライフタイム注釈

ライフタイムに名前を付けます

「ライフタイム注釈」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

ライフタイムに名前を付ける

ライフタイム注釈は、'aのようにアポストロフィで始まる名前です。何かが存続する期間を変えるのではなく、参照のライフタイム間の関係を記述します。

注釈を記述する場所

ライフタイムパラメーターは、関数名の後に山括弧で囲んで宣言し、ジェネリック型パラメーターと同じように参照型で使用します。

構文:fn name<'a>(x: &'a T) -> &'a T。

典型的なlongest関数

2つの参照のうち一方を返す関数には注釈が必要です。'aは、結果が2つの入力のうち短いほうと同じ期間だけ存続することを示します。

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

fn main() {
    let a = String::from("long string");
    let b = String::from("short");
    println!("{}", longest(&a, &b));
}

ここでの'aの意味

この注釈はコンパイラーに対して、返される参照が両方の入力が有効な間だけ有効であることを伝えます。コンパイラーはその後、すべての呼び出し箇所をこの契約に照らして検査します。

なぜ必要なのか

注釈がなければ、コンパイラーは戻り値がxとyのどちらから借用しているのか判断できません。ライフタイム名で両者を結び付けることで、借用チェッカーが結果を推論できます。

異なるライフタイム

参照同士に関係がない場合は、異なるライフタイム名を付けます。ここではxだけが返されるため、結果に関係するのはそのライフタイムだけです。

fn first<'a, 'b>(x: &'a str, _y: &'b str) -> &'a str {
    x
}

fn main() {
    let a = String::from("keep me");
    let b = String::from("ignore");
    println!("{}", first(&a, &b));
}

ライフタイムは存続期間を延ばさない

注釈によってデータの存続期間が延びることはありません。注釈は、コンパイラーが検証する制約を示すだけです。値の破棄が早すぎる場合、どのような注釈を付けてもコードはコンパイルできません。

有効な呼び出し

両方の入力が、結果を使う期間より長く存続する限り、呼び出しは受け入れられます。ここでは両方の文字列が出力処理まで存続するため、問題ありません。

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

fn main() {
    let a = String::from("abcdef");
    let result;
    {
        let b = String::from("xy");
        result = longest(&a, &b);
        println!("chosen: {}", result);
    }
}

ジェネリックとライフタイム

ライフタイムパラメーターと型パラメーターは一緒に記述できます。山括弧の中では、ライフタイムを先に列挙します。

use std::fmt::Display;

fn announce<'a, T: Display>(text: &'a str, value: T) -> &'a str {
    println!("value is {}", value);
    text
}

fn main() {
    let msg = String::from("hello");
    println!("{}", announce(&msg, 42));
}

'staticライフタイム

'staticは、参照がプログラム全体の期間にわたって存続できることを示す特別なライフタイムです。文字列リテラルはバイナリに組み込まれているため、このライフタイムを持ちます。

fn motto() -> &'static str {
    "fearless concurrency"
}

fn main() {
    println!("{}", motto());
}

注釈を読み解く

&'a strは、ライフタイム'aの間有効な文字列参照として読みます。2つのパラメーターが'aを共有すると、コンパイラーは各呼び出しで短い方のライフタイムに合わせて、それらのライフタイムを関連付けます。

簡単な確認

ライフタイム注釈についての理解度を確認しましょう。

まとめ

ライフタイムに名前を付ける方法を学びました。

  • ライフタイムには'aのような名前を付け、山かっこ内で宣言します
  • 同じ名前を共有すると、参照同士の関係(例: 入力に関連付けられた結果)を表せます
  • 注釈はライフタイムを記述するだけで、延長することはありません
  • 'staticはプログラム全体で有効であることを意味します

よくある質問

「ライフタイム注釈」レッスンは無料ですか?

はい。「ライフタイム注釈」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「ライフタイム注釈」で何を学びますか?

ライフタイムに名前を付けます ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ライフタイム注釈」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ライフタイムとは
  2. ライフタイム注釈
  3. 構造体内のライフタイム
  4. 省略規則
← Learn Rust Codingに戻る