前回の記事では、Windows 11(Intel N100搭載PC)にRustの開発環境を構築し、とりあえず画面に「Hello, world!」を出すところまで進めました。
前回は「とりあえず動かすこと」を優先しましたが、今回は「なぜ動くのか」「どうやってコードを書くのか」という、Rustの基本作法について学んでいきます。
具体的には、以下の内容をゴールにします。
それでは、さっそく始めていきましょう!
前回、プロジェクトを作る時に cargo new、実行する時に cargo run というコマンドを使いました。
この Cargo(カーゴ) とは、Rustの言語本体についてくる「ビルドシステム」兼「パッケージマネージャ」です。
他の言語だと、これらの作業は別々のツールで行うことが多いのですが、RustではCargoが全部やってくれます。「Rustでの開発=Cargoを使う」と考えて間違いありません。
では、今回の変数学習用に新しいプロジェクトを作ってみましょう。
ターミナル(PowerShellやコマンドプロンプト)を開き、以下のコマンドを実行します。
cargo new study_variablesこれで study_variables というフォルダが作成されました。
VS Codeなどでこのフォルダを開いてみましょう。
フォルダの中には、以下の重要なファイルが自動生成されています。
プログラムを実行する時、前回は cargo run を使いました。
実はこれ、裏側では2つのことをやってくれています。
開発中は頻繁に修正と実行を繰り返すので、この2つをまとめてやってくれる cargo run を基本的には使い続ければOKです。
ここからが今日の本題です。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回代入できません)と書かれています。
Rustでは、let で宣言した変数はデフォルトで「不変(Immutable)」になります。
「一度決めたら勝手に書き換わらない」ことが保証されているのです。
最初は「不便だな」と感じるかもしれませんが、これのおかげで「いつの間にか値が変わっていてバグが出た!」という事態を防ぐことができます。
もちろん、ゲームの得点や計算結果など、値を変化させたい場面はあります。
そんな時は、宣言の時に mut(mutable:可変) というキーワードを付けます。
コードを修正してみましょう。
fn main() {
let mut x = 5; // mut をつける
println!("xの値は: {}", x);
x = 10; // これならOK!
println!("xの値は: {}", x);
}これで cargo run を実行すると、今度はエラーにならず、5 と 10 が表示されます。
これがRustのコーディングにおける基本ルールです。「意図的に書き換えますよ」と宣言しない限り書き換えられない、という安全設計なんですね。
変数の使い方がわかったところで、簡単な計算をさせてみましょう。
Rustには整数、浮動小数点、論理値などの型がありますが、今回はコンパイラが自動で型を判断してくれる機能(型推論)に頼って書いてみます。
以下のコードを書いて実行してみてください。
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開発の基礎となる以下の部分を学びました。
他の言語経験があると、変数を書き換えるだけでエラーになるのは衝撃的(カルチャーショック)ですよね。でも、学び進めていくと、この「堅さ」がRustの安全性やバグの少なさに繋がっていることが実感できるそうです。
少しずつRustの流儀に慣れていきましょう!