[Rustのはじめ方] Part4: Rustの基本構文とコードスタイル

Rust

読みやすく、保守しやすいコードを書くための第一歩

Rustの学習を進める上で、基本的な構文と推奨されるコードスタイルを理解することは非常に重要です。 構文はプログラムを正しく動作させるためのルールであり、コードスタイルは人間がコードを読みやすく、理解しやすくするための指針です。 チーム開発においてはもちろん、個人開発においても、一貫したスタイルでコードを書くことは、将来の自分自身への助けとなります 💪。

この章では、Rustのプログラムがどのように構成されるかの基本と、コミュニティで広く受け入れられているコードスタイルについて学びます。

Rustの構文はC言語やC++に似ている部分もありますが、独自の特徴も多く持っています。ここでは、最も基本的な要素をいくつか見ていきましょう。

関数の定義: プログラムのエントリーポイント

Rustのプログラムは、mainという名前の関数から実行が始まります。関数はfnキーワードを使って定義します。 println!は文字列をコンソールに出力するためのマクロです。(マクロについては後ほど詳しく学びます)


// fnキーワードで関数を定義します。
// main関数はプログラムの開始地点です。
fn main() {
    // println!マクロで "Hello, Rust!" と出力します。
    println!("Hello, Rust!");
}
      

ステートメントと式

Rustのコードは主にステートメント (文)式 (Expression) で構成されます。

  • ステートメント: 何らかのアクションを実行しますが、値を返しません。通常、セミコロン (;) で終わります。変数束縛(let)などがステートメントです。
  • 式: 評価されて値を生成します。関数の戻り値や、if文のブロックなど、多くのものが式として評価されます。式の最後には通常セミコロンを付けません(付けた場合はステートメントになり、値 () を返すようになります)。

fn main() {
    // これはステートメントです。値を返さず、セミコロンで終わります。
    let x = 5;

    // ブロック `{}` も式として評価できます。
    let y = {
        let x_inner = 3;
        // このブロックの最後の式がyの値になります。セミコロンは付けません。
        x_inner + 1
    }; // ブロック全体を束縛する `let` はステートメントなのでセミコロンが必要です。

    println!("x の値: {}", x); // 出力: x の値: 5
    println!("y の値: {}", y); // 出力: y の値: 4
}
      

コメント

コード内に説明を残すためにコメントを使用します。Rustにはいくつかの種類のコメントがあります。

  • 一行コメント: // から行末までがコメントになります。
  • ブロックコメント: /**/ で囲まれた範囲がコメントになります。複数行にわたるコメントも可能です。
  • ドキュメントコメント: /// または //! で始まるコメントです。これらはrustdocツールによってドキュメントを生成するために使われます。/// は後に続く要素(関数、構造体など)のドキュメント、//! はそのコメントが含まれる要素(クレートやモジュール)全体のドキュメントになります。Markdown形式で記述できます。

// これは一行コメントです。

/*
  これは複数行にわたる
  ブロックコメントです。
*/

/// この関数は引数に1を加えた値を返します。
///
/// # Examples (使用例)
///
/// ```
/// let result = add_one(5);
/// assert_eq!(result, 6);
/// ```
fn add_one(x: i32) -> i32 {
    x + 1 // ここにも一行コメントを書けます
}

// //! このモジュールは特別な計算を提供します。 (モジュール先頭などで使用)
      

変数束縛(let, mut)やデータ型、制御構文(if, loop, match など)の詳細については、Step 2: 基本文法とデータ型Step 3: 所有権と借用 以降で詳しく解説します。ここでは、Rustコードの全体的な雰囲気と基本的なルールを掴むことを目標にしましょう 😊。

読みやすく、保守しやすいコードを書くためには、一貫したコードスタイルに従うことが重要です。Rustコミュニティには公式のスタイルガイドラインがあり、それを自動的に適用するためのツールも提供されています。

インデントと行の長さ

  • インデント: タブではなく、スペース4つを使用します。
  • 行の長さ: 1行あたりの最大文字数は、一般的に100文字が推奨されています。

命名規則

Rustでは、識別子の種類に応じて推奨される命名規則があります。

対象形式
変数、関数、メソッド、モジュール、クレート名スネークケース (snake_case)let user_name = "Alice";
fn calculate_sum() {}
mod my_module;
my_crate
型(構造体、列挙型、トレイト)、型パラメータ、ライフタイムアッパーキャメルケース (UpperCamelCase)struct UserProfile {}
enum Message {}
trait Display {}
fn generic_func<T>(arg: T) {}
fn func_with_lifetime<'a>(s: &'a str) {}
定数 (const)大文字スネークケース (SCREAMING_SNAKE_CASE)const MAX_POINTS: u32 = 100_000;
スタティック変数 (static)大文字スネークケース (SCREAMING_SNAKE_CASE)static HELLO_WORLD: &str = "Hello, world!";

詳細は Rust APIガイドラインの命名規則RFC 430 を参照してください。

rustfmt: コードフォーマッター

rustfmtは、Rust公式のコードフォーマットツールです。Rustのスタイルガイドラインに従って、コードのインデント、スペース、改行などを自動的に整形してくれます。これにより、手動でスタイルを調整する手間が省け、チーム内でのコードスタイルを統一できます。

rustfmtは通常、Rustのインストール時に一緒にインストールされます。もし入っていない場合は、以下のコマンドでインストールできます。


rustup component add rustfmt
      

プロジェクトのルートディレクトリで以下のコマンドを実行すると、プロジェクト内のすべてのRustコードが整形されます。


# プロジェクト内のコードを整形
cargo fmt
      

コードをコミットする前にcargo fmtを実行する習慣をつけると良いでしょう。

clippy: リンター

clippyは、Rust公式のリンター(静的解析ツール)です。コードを分析し、よくある間違い、非効率なコード、スタイルガイドに沿っていない箇所などを検出し、改善提案をしてくれます。コンパイラのエラーや警告よりも、さらに踏み込んだチェックを行います。

clippyも通常、Rustと一緒にインストールされます。もし入っていない場合は、以下のコマンドでインストールできます。


rustup component add clippy
      

プロジェクトのルートディレクトリで以下のコマンドを実行すると、コードのチェックが行われます。


# プロジェクト内のコードをチェック
cargo clippy
      

clippyの指摘に従うことで、より堅牢で慣用的なRustコードを書くスキルが身につきます。

ドキュメントコメント

前述の/////!を使ったドキュメントコメントは、コードの利用者に使い方や注意点を伝えるために重要です。 特に公開するライブラリ(クレート)を作成する場合は、Publicな関数や型、モジュールにはドキュメントコメントを記述することが強く推奨されます。 rustdocツールはこれらのコメントを解析し、HTML形式のドキュメントを生成します。


/// 2つの数値を加算します。
///
/// # Arguments (引数)
///
/// * `a` - 加算される数値1
/// * `b` - 加算される数値2
///
/// # Returns (戻り値)
///
/// `a` と `b` の和
///
/// # Examples (使用例)
///
/// ```
/// let sum = my_library::add(2, 3);
/// assert_eq!(sum, 5);
/// ```
///
/// # Panics (パニック)
///
/// この関数は通常パニックしません。
///
/// # Safety (安全性)
///
/// この関数は安全に呼び出すことができます。
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}
      

# Examplesセクションに書かれたコードは、cargo test実行時にテスト(ドキュメントテスト)として実行されます。

この章では、Rustのプログラムを構成する基本的な構文要素(関数定義、ステートメントと式、コメント)と、読みやすく保守しやすいコードを書くためのコードスタイル(インデント、命名規則、rustfmtclippy、ドキュメントコメント)について学びました。

最初は覚えることが多いと感じるかもしれませんが、rustfmtclippyといったツールを活用することで、自然とRustらしいコードスタイルが身についていきます。 綺麗なコードを書くことを意識して、これからの学習を進めていきましょう!✨

コメント

タイトルとURLをコピーしました