Rustの寿命とトレイト境界

RustRustBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Rustにおける境界について学びます。境界は、ジェネリック型の寿命やトレイトを制限するために使用されます。: 文字は、型内のすべての参照が特定の寿命よりも長くなければならないことを示すために使用されます。一方、+ は、型がトレイトを実装し、その型内のすべての参照が特定の寿命よりも長くなければならないことを示すために使用されます。コードのサンプルを用いて、Rustにおける境界の構文と使い方を示します。

注: 実験でファイル名が指定されていない場合、好きなファイル名を使うことができます。たとえば、main.rs を使って、rustc main.rs &&./main でコンパイルして実行することができます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/AdvancedTopicsGroup(["Advanced Topics"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/AdvancedTopicsGroup -.-> rust/operator_overloading("Traits for Operator Overloading") subgraph Lab Skills rust/variable_declarations -.-> lab-99209{{"Rustの寿命とトレイト境界"}} rust/function_syntax -.-> lab-99209{{"Rustの寿命とトレイト境界"}} rust/expressions_statements -.-> lab-99209{{"Rustの寿命とトレイト境界"}} rust/operator_overloading -.-> lab-99209{{"Rustの寿命とトレイト境界"}} end

境界

ジェネリック型が境界付けられるのと同じように、寿命(それ自体がジェネリック)も境界を使います。ここでは : 文字の意味が少し異なりますが、+ は同じです。次の文の読み方に注目してください。

  1. T: 'a: T 内の すべての 参照は寿命 'a よりも長くなければなりません。
  2. T: Trait + 'a: 型 T はトレイト Trait を実装しなければならず、T 内の すべての 参照は 'a よりも長くなければなりません。

次の例は、キーワード where の後に使われる上記の構文を示しています。

use std::fmt::Debug; // 境界付けるトレイト。

#[derive(Debug)]
struct Ref<'a, T: 'a>(&'a T);
// `Ref` は未知の寿命 `'a` を持つジェネリック型 `T` への参照を含んでいます。`T` は境界付けられており、`T` 内の任意の *参照* は `'a` よりも長くなければなりません。また、`Ref` の寿命は `'a` を超えてはなりません。

// `Debug` トレイトを使って出力するジェネリック関数。
fn print<T>(t: T) where
    T: Debug {
    println!("`print`: t is {:?}", t);
}

// ここでは、`T` が `Debug` を実装し、`T` 内のすべての *参照* が `'a` よりも長くなる場合に `T` への参照を取得します。また、`'a` は関数よりも長くなければなりません。
fn print_ref<'a, T>(t: &'a T) where
    T: Debug + 'a {
    println!("`print_ref`: t is {:?}", t);
}

fn main() {
    let x = 7;
    let ref_x = Ref(&x);

    print_ref(&ref_x);
    print(ref_x);
}

まとめ

おめでとうございます!あなたは境界付きの実験を完了しました。あなたの技術を向上させるために、LabExでさらに多くの実験を行って練習してください。