スコープとプライバシーを制御するモジュールの定義

Beginner

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

はじめに

スコープとプライバシーを制御するモジュールの定義へようこそ。この実験は、Rust Bookの一部です。LabEx で Rust のスキルを練習できます。

この実験では、モジュールについて学び、クレート内のコードを整理し、アイテムのプライバシーを制御し、モジュールツリーをナビゲートする方法を提供する方法について学びます。

これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 初級 レベルの実験の完了率は 94%です。学習者から 100% の好評価を得ています。

スコープとプライバシーを制御するモジュールの定義

このセクションでは、モジュールとモジュールシステムの他の部分、つまりアイテムに名前を付けるための「パス」、スコープにパスを持ち込むuseキーワード、およびアイテムを公開するpubキーワードについて説明します。また、asキーワード、外部パッケージ、およびグロブ演算子についても説明します。

モジュールは、読みやすさと再利用の容易さのために、クレート内のコードを整理することができます。モジュールはまた、アイテムのプライバシーを制御することもできます。なぜなら、モジュール内のコードはデフォルトで非公開になっているからです。非公開のアイテムは、外部で使用できない内部実装の詳細です。モジュールとその中のアイテムを公開するように選択することで、外部コードがそれらを使用して依存することができるようになります。

例として、レストランの機能を提供するライブラリクレートを書いてみましょう。関数のシグネチャを定義しますが、本体は空のままにして、コードの整理に集中するようにします。

レストラン業界では、レストランの一部は「フロント・オブ・ハウス」と呼ばれ、他の部分は「バック・オブ・ハウス」と呼ばれます。フロント・オブ・ハウスは、客がいる場所です。これには、ホストが客を席に案内する場所、サーバーが注文と支払いを受ける場所、バーテンダーがドリンクを作る場所が含まれます。バック・オブ・ハウスは、シェフや料理人がキッチンで働き、食器洗いが掃除をし、マネージャーが事務作業をする場所です。

このようにクレートを構造化するには、その機能をネストしたモジュールに整理することができます。cargo new restaurant --libを実行して、新しいライブラリrestaurantを作成します。次に、リスト 7-1 のコードをsrc/lib.rsに入力して、いくつかのモジュールと関数のシグネチャを定義します。このコードは、フロント・オブ・ハウスのセクションです。

ファイル名:src/lib.rs

mod front_of_house {
    mod hosting {
        fn add_to_waitlist() {}

        fn seat_at_table() {}
    }

    mod serving {
        fn take_order() {}

        fn serve_order() {}

        fn take_payment() {}
    }
}

リスト 7-1:他のモジュールを含むfront_of_houseモジュールで、それらのモジュールには関数が含まれる

modキーワードの後にモジュールの名前(この場合はfront_of_house)を続けることで、モジュールを定義します。その後、モジュールの本体は波括弧の中に入ります。モジュールの中では、他のモジュールを配置することができます。この場合、hostingservingのモジュールがそれです。モジュールはまた、構造体、列挙体、定数、トレイト、および(リスト 7-1 のように)関数など、他のアイテムの定義も保持することができます。

モジュールを使用することで、関連する定義をまとめることができ、それらが関連する理由を名前付けすることができます。このコードを使用するプログラマは、グループに基づいてコードをナビゲートすることができ、すべての定義を読み通す必要がなくなり、自分に関連する定義を見つけるのが容易になります。このコードに新しい機能を追加するプログラマは、プログラムを整理し続けるために、コードを配置する場所を知っているでしょう。

先ほど、src/main.rssrc/lib.rsはクレートのルートと呼ばれることを述べました。その名前の由来は、これら 2 つのファイルのいずれかの内容が、クレートのモジュール構造のルートにあるcrateと呼ばれるモジュールを形成するからです。これは、モジュールツリーと呼ばれます。

リスト 7-2 は、リスト 7-1 の構造のモジュールツリーを示しています。

crate
└── front_of_house
├── hosting
│ ├── add_to_waitlist
│ └── seat_at_table
└── serving
├── take_order
├── serve_order
└── take_payment

リスト 7-2:リスト 7-1 のコードのモジュールツリー

このツリーは、いくつかのモジュールが他のモジュールの中にどのようにネストしているかを示しています。たとえば、hostingfront_of_houseの中にネストしています。また、このツリーは、いくつかのモジュールが兄弟であることも示しています。つまり、同じモジュール内で定義されているということです。hostingservingは、front_of_house内で定義された兄弟です。モジュール A がモジュール B の中に含まれている場合、モジュール A はモジュール B のであり、モジュール B はモジュール A のであると言います。すべてのモジュールツリーは、暗黙のモジュールcrateの下に根付いていることに注意してください。

モジュールツリーは、コンピュータのファイルシステムのディレクトリツリーを思い出させるかもしれません。これは非常に適切な比較です!ファイルシステムのディレクトリと同じように、モジュールを使ってコードを整理します。また、ディレクトリ内のファイルと同じように、モジュールを見つける方法が必要です。

まとめ

おめでとうございます!スコープとプライバシーを制御するモジュールの定義の実験を完了しました。LabEx でさらに多くの実験を行って、スキルを向上させることができます。