Rust は「難しい言語」と長らく言われてきたが、2026年現在は学習リソースが充実し、cargo 周辺ツールも洗練されたので、3日あれば実用的なコマンドラインツールくらいは自分で書けるレベルに到達できる。本稿では、プログラミング自体は経験あるが Rust は触ったことがないという読者を想定し、3日間でやることを時間割形式で提示する。
学習のゴール
- 所有権・借用・ライフタイムを「とりあえず動かせる」レベルで理解する
-
cargoでの依存追加・テスト・ビルドが自走できる - 簡単な CLI ツール(ファイルを読んで集計する系)を最後まで書ききる
1日目: 環境構築と基礎文法(4時間)
インストール
# rustup 経由が一番素直
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
rustc --version
cargo --version
Windows なら公式の rustup-init.exe を実行するだけで良い。インストール直後に rustc --version と cargo --version が通ることを必ず確認する。
最初のプロジェクト
cargo new hello_rust
cd hello_rust
cargo run
src/main.rs を開いて、まずは変数と型を触る。
fn main() {
let name: &str = "Rust";
let mut count: i32 = 0;
count += 1;
println!("Hello, {}! count = {}", name, count);
}
let はデフォルトで不変、mut を付けると可変。これだけ覚えれば1日目の前半は十分だ。
制御構文と関数
fn add(a: i32, b: i32) -> i32 {
a + b // セミコロン無しは式 = 戻り値
}
fn main() {
for i in 0..5 {
if i % 2 == 0 {
println!("{} is even", i);
}
}
println!("sum = {}", add(3, 4));
}
2日目: 所有権・構造体・エラー処理(5時間)
所有権の最小例
fn main() {
let s = String::from("hello");
let t = s; // s は move されたので、ここ以降 s は使えない
// println!("{}", s); // コンパイルエラー
println!("{}", t);
}
借用 (&) を使えば所有権を奪わずに値を渡せる。
fn len(s: &String) -> usize {
s.len()
}
構造体と impl
struct User {
name: String,
age: u32,
}
impl User {
fn new(name: &str, age: u32) -> Self {
Self { name: name.to_string(), age }
}
fn greet(&self) {
println!("Hi, I'm {} ({})", self.name, self.age);
}
}
Result と ? 演算子
use std::fs;
use std::io;
fn read_first_line(path: &str) -> Result<String, io::Error> {
let body = fs::read_to_string(path)?;
Ok(body.lines().next().unwrap_or("").to_string())
}
? は「エラーなら早期 return、成功なら中身を取り出す」というショートカットだ。これを覚えると一気に書きやすくなる。
3日目: 実用 CLI ツールを完成させる(4時間)
題材は「ログファイルを読んで、ステータスコードごとに件数を集計する」CLI とする。
cargo new logstat
cd logstat
cargo add clap --features derive
use clap::Parser;
use std::collections::HashMap;
use std::fs;
#[derive(Parser)]
struct Args {
/// 入力ファイル
file: String,
}
fn main() {
let args = Args::parse();
let body = fs::read_to_string(&args.file).expect("ファイル読込失敗");
let mut counts: HashMap<String, u32> = HashMap::new();
for line in body.lines() {
if let Some(code) = line.split_whitespace().nth(8) {
*counts.entry(code.to_string()).or_insert(0) += 1;
}
}
let mut pairs: Vec<_> = counts.into_iter().collect();
pairs.sort_by(|a, b| b.1.cmp(&a.1));
for (code, n) in pairs {
println!("{} {}", code, n);
}
}
cargo run -- access.log で動く。これが終わるとあなたは「Rust で何か作れる人」になっている。
まとめ
3日で Rust を完璧に理解することはできない。だが、3日もあれば「自分用のツールを Rust で書く」覚悟が決まる。所有権で詰まったら、まずは clone() で逃げてよい。最初から最適化しなくても良いというのが、Rust 学習の最大のコツだ。