寿命付きの Rust 関数シグネチャ

RustRustBeginner
今すぐ練習

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

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

はじめに

この実験では、Rust における寿命付きの関数シグネチャについて学びます。ここでは、任意の参照には寿命が付与されており、返される任意の参照は入力と同じ寿命を持たなければならず、または static でなければなりません。返される参照が無効なデータを参照することになる場合、入力なしで参照を返すことは禁止されていることに注意する必要があります。提供された例では、寿命付きの関数の有効な形式が示されており、1 つの入力参照を持つ関数、可変参照を持つ関数、複数の要素と異なる寿命を持つ関数、およびパラメータとして渡された参照を返す関数が含まれます。

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/BasicConceptsGroup(["Basic Concepts"]) rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) rust/BasicConceptsGroup -.-> rust/variable_declarations("Variable Declarations") rust/BasicConceptsGroup -.-> rust/mutable_variables("Mutable Variables") rust/DataTypesGroup -.-> rust/integer_types("Integer Types") rust/DataTypesGroup -.-> rust/string_type("String Type") rust/DataTypesGroup -.-> rust/type_casting("Type Conversion and Casting") rust/FunctionsandClosuresGroup -.-> rust/function_syntax("Function Syntax") rust/FunctionsandClosuresGroup -.-> rust/expressions_statements("Expressions and Statements") rust/DataStructuresandEnumsGroup -.-> rust/method_syntax("Method Syntax") subgraph Lab Skills rust/variable_declarations -.-> lab-99205{{"寿命付きの Rust 関数シグネチャ"}} rust/mutable_variables -.-> lab-99205{{"寿命付きの Rust 関数シグネチャ"}} rust/integer_types -.-> lab-99205{{"寿命付きの Rust 関数シグネチャ"}} rust/string_type -.-> lab-99205{{"寿命付きの Rust 関数シグネチャ"}} rust/type_casting -.-> lab-99205{{"寿命付きの Rust 関数シグネチャ"}} rust/function_syntax -.-> lab-99205{{"寿命付きの Rust 関数シグネチャ"}} rust/expressions_statements -.-> lab-99205{{"寿命付きの Rust 関数シグネチャ"}} rust/method_syntax -.-> lab-99205{{"寿命付きの Rust 関数シグネチャ"}} end

関数

[省略]を無視すると、寿命付きの関数シグネチャにはいくつかの制約があります。

  • 任意の参照には寿命が付与されていなければなりません。
  • 返される任意の参照は入力と同じ寿命を持たなければなりません。または static でなければなりません。

また、入力なしで参照を返すと、無効なデータを参照する参照が返される場合があるため、禁止されています。次の例では、寿命付きの関数のいくつかの有効な形式を示しています。

// 寿命 `'a` を持つ 1 つの入力参照で、これは少なくとも関数と同じ期間だけ生存しなければなりません。
fn print_one<'a>(x: &'a i32) {
    println!("`print_one`: x is {}", x);
}

// 寿命付きで可変参照も可能です。
fn add_one<'a>(x: &'a mut i32) {
    *x += 1;
}

// 異なる寿命を持つ複数の要素。この場合、両方が同じ寿命 `'a` を持っていても問題ありませんが、
// より複雑な場合には、異なる寿命が必要になることもあります。
fn print_multi<'a, 'b>(x: &'a i32, y: &'b i32) {
    println!("`print_multi`: x is {}, y is {}", x, y);
}

// 渡された参照を返すことは許されます。ただし、正しい寿命を返さなければなりません。
fn pass_x<'a, 'b>(x: &'a i32, _: &'b i32) -> &'a i32 { x }

//fn invalid_output<'a>() -> &'a String { &String::from("foo") }
// 上記は無効です。`'a` は関数よりも長く生存しなければなりません。
// ここで、`&String::from("foo")` は `String` を作成し、その後参照を作成します。
// その後、スコープを抜けるとデータが破棄され、返される無効なデータへの参照が残ります。

fn main() {
    let x = 7;
    let y = 9;

    print_one(&x);
    print_multi(&x, &y);

    let z = pass_x(&x, &y);
    print_one(z);

    let mut t = 3;
    add_one(&mut t);
    print_one(&t);
}

まとめ

おめでとうございます!あなたは関数の実験を完了しました。あなたのスキルを向上させるために、LabExでさらに多くの実験を行って練習してください。