Rust学習ガイド

カテゴリ別に整理されたRustプログラミングガイド

💎 Rubyist向けRust

📌

変数と不変性 — Rubyの自由な再代入が消えた理由

let, mut, shadowing, const — Ruby変数と1:1比較

Rubyでは変数はいつでも再代入できる。Rustはデフォルトが不変。mut、shadowing、constの違いをRubyコードと比較して整理した。

🏷️

型システム — 動的型付けの自由を手放して得るもの

Rubyのダックタイピング vs Rustの静的型推論

Rubyはダックタイピング。「quackすればアヒル」。Rustはコンパイル時に全ての型を決定する。推論が強力なので大抵は書く必要はないが、一度決まったら絶対に変わらない。

🔧

関数とメソッド — defがfnになると何が変わるか

戻り値の型、セミコロン、そしてRubyと同じ「最後の式が戻り値」ルール

Rubyのdef → Rustのfn。引数の型と戻り値の型を明示する必要があり、セミコロン1つで戻り値の有無が決まる。それ以外はRubyと意外と似ている。

🏗️

構造体とimpl — Rubyのclassが2つに分かれる

structでデータ、implでメソッド、traitで多態性

Rubyのclassはデータとメソッドを1箇所にまとめる。Rustはstruct(データ)とimpl(メソッド)に分離し、継承の代わりにtraitで共通の振る舞いを定義する。

🎯

Enumとパターンマッチング — Symbolとcase/whenの強力な進化版

Rustのenumはデータを持てる — Rubyにはない概念

RubyのSymbolや定数グループに相当するRustのenumは、各バリアントにデータを持てる。matchはcase/whenの強化版で、全ケースを漏れなく処理する必要がある。

Option<T> — nilが消えた世界で生き残る

Rubyのnilと&.演算子がRustでどう変わるか

Rubyのnilはどこからでも出てくる。Rustにはnilがない。値が存在しないかもしれない場合はOption<T>を使い、コンパイラがNone処理を強制する。

⚠️

Resultとエラー処理 — begin/rescueが消えた場所

例外の代わりに戻り値でエラーを処理するRustの方式

Rubyは例外を投げてrescueで捕まえる。Rustには例外がない。代わりにResult<T, E>を返し、?演算子でエラーを伝播する。

🔄

イテレータとクロージャ — Rubyistが最も親しみを感じる領域

select/map/reduceがfilter/map/foldに変わっただけ

RubyのEnumerableメソッドがほぼそのままRustにある。名前が少し違うだけでチェーンパターンも同じ。RubyistがRustで最も速く適応する部分。

📝

String vs &str — Rubyにはない文字列の二つの顔

所有する文字列と借用する文字列の違い

Rubyの文字列はString1つ。Rustには2種類ある:String(所有)と&str(借用)。最初は混乱するが、所有権の概念と繋がる核心。

📦

コレクション — ArrayとHashがVecとHashMapになると

型が固定された世界の配列とハッシュマップ

RubyのArrayとHashがRustではVec<T>とHashMap<K, V>になる。最大の違いは1つの型しか入らないこと。

🗝️

所有権 — RubyのGCがやってくれていたことを自分でやる

Rubyistが最も苦戦するRustの核心概念

RubyではGCがメモリを片付けてくれる。Rustでは所有権ルールがGCの代わりをする。値を渡すと元が消えるmoveの概念が核心。

📦

Cargo — BundlerとRakeが1つになったもの

Gemfile → Cargo.toml、bundle exec → cargo run

Ruby生態系ではBundler(依存性)とRake(ビルド/タスク)を別々に使うが、RustはCargo1つで全部やる。プロジェクト生成、ビルド、テスト、依存性管理、配布まで。