Contents
Rust の特徴とメリット
Rust は「所有権」や「借用チェック」といったコンパイル時の安全機構を備えており、メモリ安全性を保証しながら実行時オーバーヘッドが極めて小さい言語です。ガベージコレクタが不要なためリアルタイム性が求められる組み込み系やサーバーサイドでも広く採用されています。このセクションでは、Rust が提供する主なメリットと、C/C++ からの移行時に特に有効になるポイントを整理します。
- 所有権:変数がデータの唯一の所有者となり、二重解放やダングリングポインタをコンパイル段階で防止します。
- 借用チェック:不変参照と可変参照のルールにより、データ競合を排除しスレッド安全なコードを書きやすくします。
- GC 不要:実行時にメモリ回収が走らないため、レイテンシが低減しバイナリサイズも抑えられます。
これらの特徴は「高速かつ安全」なシステム開発を目指すエンジニアにとって大きな魅力となります。
開発環境の構築(2024 年時点の情報を元に解説)
本章では、公式ツールである rustup と cargo を用いた開発環境のセットアップ手順を紹介します。記載内容は 2024 年 10 月現在の公式インストーラ(https://www.rust-lang.org/tools/install)に基づいており、今後のバージョン更新に伴い一部手順が変わる可能性がありますので、常に最新情報を確認してください。
rustup のインストール手順
まずは公式インストーラから rustup を取得し、Rust コンパイラと Cargo を管理できるようにします。以下のコマンドをターミナルで実行してください。
|
1 2 |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh |
- プロンプトが表示されたらデフォルト設定(
1) Proceed with installation (default))を選択します。 - インストール完了後はシェルを再起動し、
rustc --versionとcargo --versionが正しく表示されることを確認します。
cargo のパス設定
- Windows:インストーラが自動で
%USERPROFILE%\.cargo\binを環境変数PATHに追加します。 - macOS / Linux:シェルの設定ファイル(例:
~/.bashrc,~/.zshrc)に次を追記し、sourceコマンドで反映させます。
|
1 2 |
export PATH="$HOME/.cargo/bin:$PATH" |
Hello World プロジェクトの作成と実行
Cargo が正しく動作すれば、数行のコマンドでプロジェクトを生成し即座にビルド・実行できます。
|
1 2 3 4 5 6 7 |
# プロジェクト作成 cargo new hello_world --bin cd hello_world # ビルド+実行 cargo run |
cargo run はコンパイルから実行までを自動で行い、標準出力に Hello, world! と表示します。ここまでできれば開発環境は整ったと言えます。
基本文法の概要
Rust の構文はシンプルながら所有権という概念が根底にあるため、まずは変数・制御フロー・関数の基本形を体感しましょう。このセクションでは、実際に手を動かしながら覚えることを前提に、最小限のコード例と共に解説します。
変数と型推論
|
1 2 3 4 |
let x = 42; // i32 が自動的に推論される let mut y = "Rust"; // 可変バインディング y = "2024"; |
letはデフォルトで イミュータブル(変更不可)です。mutキーワードを付けると 可変 にできます。- 型は代入された値からコンパイラが推論し、明示的に書く場合は
: Typeを付記します。
制御フロー(if・match・loop)
以下の例は数値に対する条件分岐とパターンマッチングを示しています。Rust では if も式として扱える点が特徴です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
let n = 7; if n % 2 == 0 { println!("偶数"); } else { println!("奇数"); } match n { 1 => println!("One"), 2..=5 => println!("Two to Five"), _ => println!("Other"), } |
ifは式なので、変数への代入にも利用可能です。matchは全ケースを網羅しなければコンパイルエラーになるため、安全な分岐が実現できます。
関数定義と戻り値
|
1 2 3 4 |
fn add(a: i32, b: i32) -> i32 { a + b // セミコロンなしで式として返す } |
- パラメータは必ず型注釈が必要です。
- 戻り値の型は
-> Typeで示し、最後に書いた式が自動的に返されます(セミコロンを付けない点に注意)。
エラーハンドリングと Result 型
Rust は例外機構を持たず、エラーは Result? 演算子を使うことで、エラー伝搬が非常にシンプルになります。この章では実務で頻繁に出くわす「ファイル入出力」の例を通じて、Result と ? の基本的な使い方を学びます。
Result と ? 演算子の基本
|
1 2 3 4 5 6 7 8 9 10 |
use std::fs::File; use std::io::{self, Read}; fn read_file(path: &str) -> Result<String, io::Error> { let mut file = File::open(path)?; // エラーなら即上位へ返す let mut contents = String::new(); file.read_to_string(&mut contents)?; Ok(contents) } |
Result::Okが成功、Result::Errが失敗を示します。?は内部的にmatchを展開し、Errの場合は呼び出し元へ早期リターンします。
呼び出し側でのエラーハンドリング
|
1 2 3 4 5 6 7 |
fn main() { match read_file("data.txt") { Ok(text) => println!("内容: {}", text), Err(e) => eprintln!("エラー: {}", e), } } |
matchによって成功時と失敗時の処理を明示的に分岐させます。- ネットワーク通信やデータベースアクセスでも同様のパターンが適用可能です。
学習リソースの選び方(中立的な複数紹介)
Rust を体系的に学ぶ際は、公式ドキュメント・無料オンライン教材・書籍をバランスよく組み合わせることが重要です。以下では、執筆者や出版社に依存しない形で評価の高いリソースを一覧化しました。リンク先は 2024 年時点で有効と確認できたものですが、将来的な変更に備えて公式サイトから最新情報を取得してください。
公式ドキュメント
| リソース | 内容 | URL |
|---|---|---|
| The Rust Book | 基礎から実践まで網羅した無料オンラインブック。章ごとに演習コードが用意されている。 | https://doc.rust-lang.org/book/ |
| Rust by Example | 実例中心のチュートリアル集。小さなサンプルを読んで手を動かす形式。 | https://doc.rust-lang.org/rust-by-example/ |
| API Reference | 標準ライブラリや言語機能の詳細仕様。検索しやすい構造になっている。 | https://doc.rust-lang.org/std/ |
無料オンライン教材
- Rustlings(GitHub): 小さな課題を順に解くことで所有権・借用を体感できる学習キット。
https://github.com/rust-lang/rustlings - exercism.io の Rust トラック: コードレビュー付きの演習プラットフォーム。
https://exercism.org/tracks/rust
書籍(出版社・著者が多様)
| 書名 | 対象レベル | 主な特徴 |
|---|---|---|
| 『入門 Rust (第2版)』 | 初心者向け | 所有権と借用を図解で解説、豊富な練習問題付き |
| 『Rust実践ガイド』 | 中級者向け | 非同期 I/O (async/await) とエコシステム(クレート)の活用例 |
| 『Zero To Production in Rust』 | 上級者向け | Web アプリケーション構築に特化、テスト・デプロイまで網羅 |
学習ロードマップの例
- 公式ブックで基礎概念と Hello World まで完了。
- Rustlingsや exercism.io の演習で所有権・借用を体得。
- 書籍から一冊選び、非同期処理やクレート利用の実務的スキルへステップアップ。
このように段階的にリソースを組み合わせると、知識が定着しやすくなります。
コミュニティ参加と実践プロジェクト
学習した知識はコミュニティでアウトプット・フィードバックを得ることでさらに深まります。ここでは主要な交流拠点と、実際に手を動かせる小規模 CLI アプリの作成例をご紹介します。
主な Rust コミュニティ
| 場所 | 用途 |
|---|---|
| Users Forum (https://users.rust-lang.org) | 質問・ベストプラクティスの議論。検索してから投稿すると回答率が高まる。 |
| GitHub(rust-lang 組織) (https://github.com/rust-lang) | オープンソースプロジェクトへの貢献やクレート探索に最適。 |
| Discord(official Rust server) (https://discord.gg/rust) | リアルタイムで質問でき、初心者向けチャンネルも充実している。 |
CLI ツール作成例:引数解析と Result の活用
まずは Cargo で新規バイナリプロジェクトを作ります。
|
1 2 3 |
cargo new greet_cli --bin cd greet_cli |
次に依存クレート clap = "4" を追加し、以下のコードを書きます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
use clap::Parser; use std::fs; /// コマンドライン引数を定義する構造体 #[derive(Parser)] struct Args { /// 挨拶対象の名前(必須) name: String, /// 結果を書き込むファイルパス(省略可) #[arg(short, long)] out: Option<String>, } fn main() -> Result<(), Box<dyn std::error::Error>> { // 引数をパース let args = Args::parse(); // 挨拶文字列を生成し標準出力へ let greeting = format!("Hello, {}!", args.name); println!("{}", greeting); // `out` が指定されていればファイルに書き込む if let Some(path) = args.out { fs::write(path, &greeting)?; // エラーは `?` で伝搬 } Ok(()) } |
- clap は自動でヘルプメッセージと引数検証を提供します。
- ファイル書き込みは
Resultと?によってエラーハンドリングが簡潔です。
この程度のコードでも実用的なツールが完成し、次のステップとして Cargo のワークスペース や 統合テスト を導入すれば、プロジェクト規模を自然に拡大できます。
まとめ
- Rust の特徴:所有権・借用でメモリ安全性を実現し、GC が不要な高速バイナリが生成できる。
- 環境構築:公式インストーラから rustup と cargo を導入し、数行のコマンドで Hello World が動く。
- 基本文法:変数はデフォルトでイミュータブル、
if・matchで安全な制御フロー、関数は式として値を返す。 - エラーハンドリング:Result と
?により例外なしでエラー伝搬が行える。 - 学習リソース:公式ドキュメント・無料教材・多様な書籍を段階的に活用し、実践的スキルへとつなげる。
- コミュニティ & 実践:Forum・GitHub・Discord で情報交換し、CLI ツール作成などハンズオンで経験値を上げよう。
これらの手順とリソースを組み合わせて学習すれば、Rust の基礎から実務レベルの応用まで体系的に身につけることができます。ぜひ自分のプロジェクトや興味のある領域で試しながら、継続的にスキルを磨いてください。