はじめに
こんにちは!ITスクールRareTECHにてCS(Customer Support)を担当している池村です。
今回の記事はRustの基本文法の書き方についてです。変数とそのデータ型までを備忘録的に記事にしています。前回の記事の続きですので、先に環境構築を行いたい方は以下の記事を参考にしてください。
変数
Rustの変数定義について見ていきます。
Rustの場合、let
を用いて変数を定義するようです。
let num = 10;
変数の中身の確認方法は以下です。
dbg!(num);
もしくは
println!("{}", num);
マクロってなんだ?
Rustの本を読んでいてマクロってなんだっけ?となった。変数の中身をdbg!
とかprintln!
で確認しているが、エクセルのマクロの話じゃないよね。
関数とも違うらしいのでピンとこなかった。多分Cとかやっている人にはピンとくるんだろうと思う。
公式ドキュメントの説明と睨めっこしてなんとなく理解したことをまとめる。
- 関数は型や引数を厳密に決める必要があるが、マクロはそれにとらわれない
- コンパイル前に動く
- 関数は「何かをやる手順」を決めるもので、マクロは「どんな手順を書くか」を決めるもの
Pythonでいうところのデコレータに近いもの?厳密には違う気がするが、今はそんな理解に留める。
これは後でしっかりまとめていこうと思う。
fn main() {
let num = 10;
let num1 = 2;
dbg!(num);
println!("{}", num1);
}
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/test_hello`
[src/main.rs:6:5] num = 10
2
算術演算子の場合
fn main() {
let num = 10 + 2;
let num1 = num * 3;
dbg!(num);
dbg!(num1);
}
[src/main.rs:6:5] num = 12
[src/main.rs:7:5] num1 = 36
}
num1
の計算が10 + 2 * 3
の計算ではなく、先に10 + 2
が計算された後に* 3
の計算がされる。先に変数num
が定義され、その後にnum1
の計算がされる。この順番をしっかり押さえていきたい。
不変と可変の話
Rustの変数定義はデフォルトでは不変である。再代入は認めない。ただ、定数はまた別にある。再代入をする際の記述方法もちゃんとあります。
let mut num = 10;
num = num * 2;
mut
修飾子を使うことで、本来不変の変数を可変にすることが可能になります。
今回はデータの型については詳しく書かないです。型推論が搭載されている言語の場合、変数程度では型を意識するところは多くないです。
初心者向けに解説すると、変数などに格納するデータには型というものがあります。データとは、数値とか、文字とかそういうのですね。
条件分岐
if
文の書き方は以下になります。変数の値はかなり適当ですが、上の続きでそのまま書いています。
fn main() {
let num = 10 + 1;
let num1 = num * 3;
if num == 12{
println!("値は12です");
} else {
println!("12ではなくなっています");
}
}
12ではなくなっています
if文の書き方は特に他の言語と違いはないですね。
dbg!
のマクロを使うと条件式の中身の確認もできて便利そう。
fn main() {
let num = 10 + 1;
let num1 = num * 3;
if dbg!(num == 12){
println!("値は12です");
} else {
println!("12ではなくなっています");
}
}
[src/main.rs:7:8] num == 12 = false
12ではなくなっています
繰り返し
条件分岐の次は繰り返しですね。
for
文
for i in 1..5{
println!("i = {}", i);
}
これは変数i
の数が1~4の間ブロックの中の処理を繰り返していきます。
i = 1
i = 2
i = 3
i = 4
便利だけど若干わかりにくい書き方だな〜と思ったのが以下⬇️の書き方です。
for i in 1..=5{
println!("i = {}", i);
}
i = 1
i = 2
i = 3
i = 4
i = 5
この場合、変数i
の数が1~5までになると。むしろ初学者にはこっちの方がわかりやすいかも。
while
文
while文ももちろんありますね。Whileは条件式を書いて、その条件式がTrueになっている時だけ繰り返しの処理を行います。以下は公式ドキュメントにあったコードです。
let mut number = 3;
while number != 0 {
println!("{}!", number);
number -= 1;
}
// 発射!
println!("LIFTOFF!!!");
- 可変の変数を定義して、3を代入
- while文の条件式は『0ではない場合』を指定
- whileのブロック範囲内で、変数
number
の値を画面に表示(最初は3) - 変数
number
から数値を1ずつ減らしていく - 変数
number
の値が1ずつ減っていき、0になったらwhileのブロックを抜けて最後の『LIFTOFF!!!』を画面に表示して終了
loop
文
loop
はずっと繰り返す構文です。break
を使うとループを抜けることができるタイプの繰り返しですね。
無限ループは以下の書き方。Ctrl + Cでストップできます。
loop {
println!("ずっと繰り返す");
}
break
文で抜ける場合はif
文で条件を指定する。
let mut count = 0;
loop {
println!("Count: {}", count);
count += 1;
if count == 5 {
break; // ループを終了する
}
}
println!("ループの終了");
タグに関しては今回は触れません。
おわりに
読了ありがとうございます。
とりあえず余計なことは考えず、基本の構文について記事にしました。
初学者がつまづきそうなものは一旦スキップ。基本中の基本をまずは学んで、深いところは後ででよろしいと思っているタイプです。
次回は関数周りですね。
余談
基本構文の条件分岐と繰り返しを学んでいる時が一番面白くないと思ってしまうのは自分だけかな、、?