Rustモジュールの可視性の探究

RustRustBeginner
今すぐ練習

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

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

はじめに

この実験では、Rust モジュール内の項目の可視性について学びます。これには、デフォルトのプライベート可視性、可視性をオーバーライドするための pub 修飾子の使用、および pub(in path)pub(self)pub(super)pub(crate) などのさまざまな可視性レベルが含まれます。また、ネストされたモジュールと、モジュール内のプライベート項目にアクセスする際の制限についても検討します。

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL rust(("Rust")) -.-> rust/DataTypesGroup(["Data Types"]) rust(("Rust")) -.-> rust/FunctionsandClosuresGroup(["Functions and Closures"]) rust(("Rust")) -.-> rust/DataStructuresandEnumsGroup(["Data Structures and Enums"]) 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/type_casting -.-> lab-99332{{"Rustモジュールの可視性の探究"}} rust/function_syntax -.-> lab-99332{{"Rustモジュールの可視性の探究"}} rust/expressions_statements -.-> lab-99332{{"Rustモジュールの可視性の探究"}} rust/method_syntax -.-> lab-99332{{"Rustモジュールの可視性の探究"}} end

可視性

デフォルトでは、モジュール内の項目はプライベートな可視性を持ちますが、これは pub 修飾子でオーバーライドできます。モジュールのスコープ外からは、モジュールのパブリックな項目のみにアクセスできます。

// `my_mod` という名前のモジュール
mod my_mod {
    // モジュール内の項目はデフォルトでプライベートな可視性になります。
    fn private_function() {
        println!("called `my_mod::private_function()`");
    }

    // デフォルトの可視性をオーバーライドするには `pub` 修飾子を使用します。
    pub fn function() {
        println!("called `my_mod::function()`");
    }

    // 項目は同じモジュール内の他の項目にアクセスできます。
    // プライベートであっても。
    pub fn indirect_access() {
        print!("called `my_mod::indirect_access()`, that\n> ");
        private_function();
    }

    // モジュールはネストすることもできます。
    pub mod nested {
        pub fn function() {
            println!("called `my_mod::nested::function()`");
        }

        #[allow(dead_code)]
        fn private_function() {
            println!("called `my_mod::nested::private_function()`");
        }

        // `pub(in path)` 構文を使用して宣言された関数は、
        // 与えられたパス内でのみ可視です。`path` は親または祖先モジュールでなければなりません。
        pub(in crate::my_mod) fn public_function_in_my_mod() {
            print!("called `my_mod::nested::public_function_in_my_mod()`, that\n> ");
            public_function_in_nested();
        }

        // `pub(self)` 構文を使用して宣言された関数は、
        // 現在のモジュール内でのみ可視で、これはそれらをプライベートにしたままであることと同じです。
        pub(self) fn public_function_in_nested() {
            println!("called `my_mod::nested::public_function_in_nested()`");
        }

        // `pub(super)` 構文を使用して宣言された関数は、
        // 親モジュール内でのみ可視です。
        pub(super) fn public_function_in_super_mod() {
            println!("called `my_mod::nested::public_function_in_super_mod()`");
        }
    }

    pub fn call_public_function_in_my_mod() {
        print!("called `my_mod::call_public_function_in_my_mod()`, that\n> ");
        nested::public_function_in_my_mod();
        print!("> ");
        nested::public_function_in_super_mod();
    }

    // pub(crate) は関数を現在のクレート内でのみ可視にします。
    pub(crate) fn public_function_in_crate() {
        println!("called `my_mod::public_function_in_crate()`");
    }

    // ネストされたモジュールは可視性に関して同じルールを適用します。
    mod private_nested {
        #[allow(dead_code)]
        pub fn function() {
            println!("called `my_mod::private_nested::function()`");
        }

        // プライベートな親項目は、子項目の可視性を依然として制限します。
        // より大きなスコープ内で可視と宣言されていたとしても。
        #[allow(dead_code)]
        pub(crate) fn restricted_function() {
            println!("called `my_mod::private_nested::restricted_function()`");
        }
    }
}

fn function() {
    println!("called `function()`");
}

fn main() {
    // モジュールは同じ名前の項目間での曖昧さを解消します。
    function();
    my_mod::function();

    // パブリックな項目、ネストされたモジュール内のものを含めて、
    // 親モジュールの外からアクセスできます。
    my_mod::indirect_access();
    my_mod::nested::function();
    my_mod::call_public_function_in_my_mod();

    // pub(crate) 項目は同じクレート内のどこからでも呼び出せます。
    my_mod::public_function_in_crate();

    // pub(in path) 項目は指定されたモジュール内からのみ呼び出せます。
    // エラー!関数 `public_function_in_my_mod` はプライベートです。
    //my_mod::nested::public_function_in_my_mod();
    // TODO ^ この行のコメントを外してみてください。

    // モジュールのプライベートな項目は、
    // パブリックなモジュールにネストされていたとしても、直接アクセスできません。

    // エラー!`private_function` はプライベートです。
    //my_mod::private_function();
    // TODO ^ この行のコメントを外してみてください。

    // エラー!`private_function` はプライベートです。
    //my_mod::nested::private_function();
    // TODO ^ この行のコメントを外してみてください。

    // エラー!`private_nested` はプライベートなモジュールです。
    //my_mod::private_nested::function();
    // TODO ^ この行のコメントを外してみてください。

    // エラー!`private_nested` はプライベートなモジュールです。
    //my_mod::private_nested::restricted_function();
    // TODO ^ この行のコメントを外してみてください。
}

まとめ

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