【Rust入門】基本作法を学ぶ!Cargoの正体と「変更できない変数」の謎

前回の記事では、Windows 11(Intel N100搭載PC)にRustの開発環境を構築し、とりあえず画面に「Hello, world!」を出すところまで進めました。

前回は「とりあえず動かすこと」を優先しましたが、今回は「なぜ動くのか」「どうやってコードを書くのか」という、Rustの基本作法について学んでいきます。

具体的には、以下の内容をゴールにします。

  1. 前回なんとなく使ったツール「Cargo(カーゴ)」の役割を知る。
  2. Rustの「変数は書き換えられない」というルールに慣れる。
  3. 簡単な計算と条件分岐を書いてみる。

それでは、さっそく始めていきましょう!


1. Rustの開発パートナー「Cargo」とは?

前回、プロジェクトを作る時に cargo new、実行する時に cargo run というコマンドを使いました。
この Cargo(カーゴ) とは、Rustの言語本体についてくる「ビルドシステム」兼「パッケージマネージャ」です。

  • ビルドシステム: プログラムをコンパイルして実行可能なファイルを作る。
  • パッケージマネージャ: 必要なライブラリ(Rustでは「クレート」と呼びます)をダウンロード・管理してくれる。

他の言語だと、これらの作業は別々のツールで行うことが多いのですが、RustではCargoが全部やってくれます。「Rustでの開発=Cargoを使う」と考えて間違いありません。

学習用プロジェクトの作成

では、今回の変数学習用に新しいプロジェクトを作ってみましょう。
ターミナル(PowerShellやコマンドプロンプト)を開き、以下のコマンドを実行します。

cargo new study_variables

これで study_variables というフォルダが作成されました。
VS Codeなどでこのフォルダを開いてみましょう。

フォルダの中には、以下の重要なファイルが自動生成されています。

  • Cargo.toml:
    このプロジェクトの「設定ファイル」です。アプリの名前、バージョン、著者の情報などが書かれています。今後、外部ライブラリを使う時はここに追記することになります。
  • src/main.rs:
    プログラムのソースコード本体です。ここを編集して開発を進めます。

ビルドと実行を一発で行う

プログラムを実行する時、前回は cargo run を使いました。
実はこれ、裏側では2つのことをやってくれています。

  1. cargo build: プログラムをコンパイル(翻訳)する。
  2. 実行: 生成されたプログラムを動かす。

開発中は頻繁に修正と実行を繰り返すので、この2つをまとめてやってくれる cargo run を基本的には使い続ければOKです。


2. Rustの洗礼?「変数は変えられない」

ここからが今日の本題です。src/main.rs を使って、Rustの変数の特徴を実験してみましょう。

一般的にプログラミングの「変数」といえば、「値を入れる箱」のようなもので、中身は自由に入れ替えられるイメージがありますよね。
しかし、Rustは違います。

main.rs の中身を、以下のように書き換えてみてください。

fn main() {
    let x = 5;
    println!("xの値は: {}", x);
    
    x = 10; // ここで値を書き換えてみる
    println!("xの値は: {}", x);
}

書き換えたら、ターミナルで実行してみましょう。codeBash

cargo run

すると……?

エラーになります!
エラーメッセージには cannot assign twice to immutable variable (不変な変数に2回代入できません)と書かれています。

「不変(Immutable)」がデフォルト

Rustでは、let で宣言した変数はデフォルトで「不変(Immutable)」になります。
「一度決めたら勝手に書き換わらない」ことが保証されているのです。

最初は「不便だな」と感じるかもしれませんが、これのおかげで「いつの間にか値が変わっていてバグが出た!」という事態を防ぐことができます。


3. 値を変更したい場合は mut を使う

もちろん、ゲームの得点や計算結果など、値を変化させたい場面はあります。
そんな時は、宣言の時に mut(mutable:可変) というキーワードを付けます。

コードを修正してみましょう。

fn main() {
    let mut x = 5; // mut をつける
    println!("xの値は: {}", x);
    
    x = 10; // これならOK!
    println!("xの値は: {}", x);
}

これで cargo run を実行すると、今度はエラーにならず、5 と 10 が表示されます。

  • 基本は変更不可(不変)。
  • 変更する必要がある時だけ mut をつける。

これがRustのコーディングにおける基本ルールです。「意図的に書き換えますよ」と宣言しない限り書き換えられない、という安全設計なんですね。


4. 基本的なデータ型と四則演算

変数の使い方がわかったところで、簡単な計算をさせてみましょう。
Rustには整数、浮動小数点、論理値などの型がありますが、今回はコンパイラが自動で型を判断してくれる機能(型推論)に頼って書いてみます。

四則演算とif文のサンプル

以下のコードを書いて実行してみてください。

fn main() {
    let a = 10;
    let b = 3;

    // 四則演算
    let sum = a + b;        // 足し算
    let difference = a - b; // 引き算
    let product = a * b;    // 掛け算
    let quotient = a / b;   // 割り算(整数同士なので結果も整数)
    let remainder = a % b;  // 余り(剰余)

    println!("足し算: {}", sum);
    println!("割り算: {}", quotient); // 3になります
    println!("余り: {}", remainder);

    // 条件分岐 (if)
    // Rustのifは、条件式にカッコ ( ) が要らないのが特徴です!
    if remainder == 0 {
        println!("割り切れました!");
    } else {
        println!("割り切れませんでした。");
    }
}

cargo run で実行すると、計算結果が表示されます。
10 / 3 は整数同士の計算なので 3 になり、余りが 1 なので else の方が実行されるはずです。

もし let a = 9; に書き換えて実行すれば、「割り切れました!」に変わります。

これで、変数の宣言・計算・条件分岐というプログラムの基礎が動かせました。


まとめ

今回は、Rust開発の基礎となる以下の部分を学びました。

  • Cargo はビルドからライブラリ管理まで行う万能ツール。基本は cargo run でOK。
  • Rustの変数は デフォルトで変更不可(不変) である。
  • 値を書き換えたい変数は let mut で宣言する。
  • 条件分岐の if はカッコが不要でシンプルに書ける。

他の言語経験があると、変数を書き換えるだけでエラーになるのは衝撃的(カルチャーショック)ですよね。でも、学び進めていくと、この「堅さ」がRustの安全性やバグの少なさに繋がっていることが実感できるそうです。

少しずつRustの流儀に慣れていきましょう!

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!! にほんブログ村