Rust 固有の機能

完了

あるプログラミング言語がプロジェクトに適しているかどうかを判断するには、その機能と制限事項を知る必要があります。 そのうえで、候補となる言語を比較し、最適な言語を選択できます。

このレッスンでは、Rust の機能と制限事項のうち、いくつかを検討します。

  • Rust モジュール システム: モジュール、クレート、パス
  • Rust 標準ライブラリとサードパーティ製のクレート
  • Rust の Cargo ツールと依存関係マネージャー
  • Rust を使用するケース

Rust モジュール システムを使用してコードを管理する

Rust には、コードの管理と整理に役立つ機能のコレクションが用意されています。 これらの機能は、Rust モジュール システムと呼ばれます。 システムは、"クレート"、"モジュール"、"パス"、およびそれらの項目を操作するためのツールで構成されます。

  • クレート: Rust クレートはコンパイル単位です。 これは、Rust コンパイラで実行できる最小のコード単位です。 クレート内のコードはまとめてコンパイルされ、バイナリ実行可能ファイルまたはライブラリが作成されます。 Rust では、クレートだけが再利用可能な単位としてコンパイルされます。 クレートには、最上位に暗黙的で名前のないモジュールのあるRust モジュールの階層が含まれています。

  • モジュール: Rust モジュールは、クレート内の個々のコード項目のスコープを管理できるようにすることで、プログラムを整理しやすくします。 関連するコード項目または一緒に使用される項目は、同じモジュールにグループ化することができます。 再帰コード定義は、他のモジュールにまたがることができます。

  • パス: Rust では、パスを使用してコード内の項目に名前を付けることができます。 たとえば、パスとして、ベクター、コード関数、場合によってはモジュールといったデータ定義が考えられます。 また、モジュール機能はパスのプライバシーの制御にも役立ちます。 公開でアクセスできるコードの部分と非公開の部分を指定できます。 この機能を使用すると、実装の詳細を隠すことができます。

Rust のクレートとライブラリを使用する

Rust 標準ライブラリ std には、Rust プログラムの基本的な定義と操作のための再利用可能なコードが含まれています。 このライブラリには、StringVec<T> のようなコア データ型の定義、Rust プリミティブの操作、一般的に使用されるマクロ関数のコード、入出力アクションのサポート、およびその他多くの分野の機能が含まれています。

Rust プログラムで使用できるライブラリとサードパーティ製のクレートは何万種類もあり、そのほとんどが、Rust のサードパーティ製のクレート リポジトリ crates.io からアクセスできます。 これらのクレートにプロジェクトからアクセスする方法については後ほど学習しますが、ここではプログラミング演習で使用するクレートをいくつか紹介します。

  • std - Rust 標準ライブラリ。 Rust の演習では、次のモジュールを確認します。
    • std::collections - コレクション型の定義。HashMap など。
    • std::env - お使いの環境を操作する関数。
    • std::fmt - 出力形式を制御する機能。
    • std::fs - ファイル システムを操作する関数。
    • std::io - 入力/出力を操作する定義と機能。
    • std::path - ファイル システム パス データの操作をサポートする定義と関数。
  • structopt - コマンド ライン引数を簡単に解析するためのサードパーティ製のクレート。
  • chrono - 日付と時刻のデータを処理するサードパーティ製のクレート。
  • regex - 正規表現を処理するサードパーティ製のクレート。
  • serde - Rust データ構造のシリアル化および逆シリアル化操作のサードパーティ製のクレート。

既定では、std ライブラリは、すべての Rust クレートで使用できます。 クレートまたはライブラリ内の再利用可能コードにアクセスするために、use キーワードが実装されています。 use キーワードを使用すると、クレートまたはライブラリ内のコードが "スコープに取り込まれる" ので、プログラム内で定義と関数にアクセスできます。 標準ライブラリには、use std::fmt のように、パス std を含む use ステートメントでアクセスします。 その他のクレートまたはライブラリには、use regex::Regex のように、それらの名前でアクセスします。

Cargo を使用してプロジェクトを作成して管理する

Rust コンパイラ (rustc) を直接使用してクレートをビルドすることもできますが、ほとんどのプロジェクトは、Cargo と呼ばれる Rust ビルド ツール兼依存関係マネージャーを使用しています。

Cargo は、次のような多くの機能を備えています。

  • cargo new コマンドを使用して、新しいプロジェクト テンプレートを作成する。
  • cargo build コマンドを使用して、プロジェクトをビルドする。
  • cargo run コマンドを使用して、プロジェクトをビルドして実行する。
  • cargo test コマンドを使用して、プロジェクトをテストする。
  • cargo check コマンドを使用して、プロジェクトの種類を確認する。
  • cargo doc コマンドを使用して、プロジェクトのドキュメントをビルドする。
  • cargo publish コマンドを使用して、crates.io にライブラリを発行する。
  • Cargo.toml ファイルにクレート名を追加して、依存クレートをプロジェクトに追加する。

Rust を使用するケース

Rust 言語には、プロジェクトに最適な言語を選択する際に考慮すべき多くの長所があります。

  • Rust を使用すると、この言語で記述されたプログラムやライブラリのパフォーマンスとリソースの消費量を C および C++ と同等に制御しながら、既定でメモリ セーフを維持することができます。 このレベルの制御により、よくあるバグの種類全体が排除されます。
  • Rust には豊富な抽象化機能が備わっているので、開発者はプログラムの不変条件の多くをコードにエンコードできます。 その後、慣習やドキュメントに頼る代わりに、コンパイラによってコードをチェックできます。 この機能により、"コンパイルできれば動作する" と感じるようになることも多くあります。
  • Rust には、コードのビルド、テスト、文書化、共有を行うためのツールが組み込まれています。また、サードパーティ製のツールやライブラリの豊富なエコシステムも整っています。 これらのツールを使用すると、一部の言語では依存関係の構築などの難しい作業を、Rust では簡単かつ生産性の高い方法で行うことができます。

自分の知識をチェックする

次の質問に答えて、学習した内容を確認してください。 質問ごとに回答を 1 つ選択して、[回答を確認] を選択します。

1.

Rust を使用することの説得力のある強みは何ですか?

2.

Rust コードはどのように実行されますか?

3.

Cargo でできないことの例はどれですか?