0Pricing
Learn Rust Coding · レッスン

省略規則

ライフタイムが推論される場合

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

書かなくてよいライフタイム

多くの関数はライフタイム注釈なしで参照を受け取り、返しますが、それでもコンパイルできます。これはライフタイムの省略(lifetime elision)によるものです。コンパイラーが明らかなライフタイムを推論してくれます。

省略は単なる短縮表記

省略によってライフタイムそのものがなくなるわけではありません。コンパイラーは、いくつかの決定的なルールを使って内部でライフタイムを補います。そのルールで対応できる場合は、注釈を省略できます。

省略された関数

この関数には明示的なライフタイムがありませんが、コンパイラーは返される参照が入力から借用されることを理解します。ルールによって曖昧さがなくなるためです。

fn first_word(s: &str) -> &str {
    s.split(' ').next().unwrap_or("")
}

fn main() {
    let phrase = String::from("rust is fun");
    println!("{}", first_word(&phrase));
}

ルール1: 各入力に固有のライフタイム

最初のルールは、パラメーター内で省略された各ライフタイムに異なるライフタイムを割り当てるというものです。2つの参照パラメーターには、別々のライフタイムが割り当てられます。

ルール2: 1つの入力から1つの出力へ

2番目のルールは、入力ライフタイムがちょうど1つの場合、それをすべての出力ライフタイムに割り当てるというものです。これは、1つの参照を受け取り、1つの参照を返すfirst_wordのような関数に適用されます。

fn trim_start(s: &str) -> &str {
    s.trim_start()
}

fn main() {
    println!("[{}]", trim_start("   hi"));
}

ルール3: メソッドと&self

3番目のルールは、メソッドに&selfまたは&mut selfがある場合、selfのライフタイムをすべての出力ライフタイムに割り当てるというものです。これが、メソッドで注釈がほとんど必要ない理由です。

struct Holder { value: String }

impl Holder {
    fn get(&self) -> &str {
        &self.value
    }
}

fn main() {
    let h = Holder { value: String::from("stored") };
    println!("{}", h.get());
}

省略で対応できない場合

3つのルールをすべて適用した後も出力ライフタイムが不明な場合、コンパイラーは明示的な注釈を求めます。longest関数が典型的な例です。入力が2つあり、出力が曖昧だからです。

longest関数をもう一度

参照入力が2つで、参照出力が1つあります。入力が複数あるためルール2は適用されず、selfもありません。そのため、注釈を付ける必要があります。

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

fn main() {
    println!("{}", longest("abcd", "ab"));
}

複数の入力とselfからの出力

複数のパラメーターを持つメソッドでも、他の参照パラメーターが存在する場合に関係なく、ルール3によって出力ライフタイムはselfから取得されます。

struct Doc { body: String }

impl Doc {
    fn announce(&self, _note: &str) -> &str {
        &self.body
    }
}

fn main() {
    let d = Doc { body: String::from("content") };
    println!("{}", d.announce("ping"));
}

ルールが存在する理由

この3つのルールで実際のコードの圧倒的多数をカバーできるため、ほとんどの関数ではライフタイム構文がまったく必要ありません。意図が本当に曖昧な場合だけ注釈を記述します。

簡単なチェックリスト

省略を適用できるか判断するには、次の点を確認します。

  • 入力参照がちょうど1つありますか?出力はそこから借用されます。
  • &selfがありますか?出力はselfから借用されます。
  • それ以外の場合は、明示的に注釈を付けます。

簡単な確認

ライフタイム省略ルールについての理解度を確認しましょう。

まとめ

ライフタイムが推論される場合について学びました。

  • ルール1: 各入力参照には固有のライフタイムが割り当てられます
  • ルール2: 1つの入力ライフタイムがすべての出力に対応します
  • ルール3: メソッドでは&selfが出力ライフタイムを提供します
  • 出力が曖昧なままなら、明示的に注釈を付けます

よくある質問

「省略規則」レッスンは無料ですか?

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

「省略規則」で何を学びますか?

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

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

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

「省略規則」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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