制御構文
「制御構文」とは上から下に順番に実行されるプログラムの流れを変える働きをする構文です。制御構文には大きく分けて「分岐構文」と「繰り返し構文」があります。
分岐構文は、もし条件が満たされたり満たされなかったりした場合だけ処理を実行する構文です。その名の通り「if」文と言います。
繰り返し構文には範囲内の値をループする「for」文と、条件が満たされる間ループする「while」文があります。解説はしませんが他にも繰り返し構文に「loop」文がありますが、知っていて損はないですが、あまり使わないかもしれません。
分岐構文if文
「if 条件」の条件が満たされた場合、直後のスコープ内の処理が実行されます。満たされなかった場合「else if 条件」の条件が満たされた場合、直後のスコープ内の処理が実行されます。それも満たさなかった場合「else」直後のスコープ内の処理が実行されます。
if文の文法
if 条件 {
ステートメント
} else if 条件 {
ステートメント
} else {
ステートメント
}
fn main() { let i = 0; if i < 0 { println!("iは0より小さい"); } else if i == 0 { println!("iは0"); } else { println!("iは0より大きい") } }
繰り返し構文for文
「for 変数 in 範囲」で範囲の各値が変数に代入されて直後のスコープ内の処理を繰り返し実行します。範囲は「0..10」と書けば0〜10未満まで1ずつインクリメントされます。範囲に配列を書けば配列の全ての要素が繰り返されます。範囲を超えたらループを抜け出します。
for文の文法
for 変数 in 範囲 {
ステートメント
}
fn main() { for i in 0..10 { println!("i={}",i); } }
繰り返し構文while文
「while 条件」の条件が満たされている間、直後のスコープ内の処理を繰り返し実行します。条件が満たされなくなったらループを抜け出します。
while文の文法
while 条件 {
ステートメント
}
fn main() { let mut sum = 0; // 後で値が変更されるので「mut」を付ける while sum < 1000 { sum += 100; println!("合計は{}円",sum); } }
パターンマッチングmatch文
一般のプログラミング言語でいう「switch」文に似た文法がmatch文です。「match 変数」の変数に当てはまるものを、直後のスコープ内から探して分岐します。当てはまるものがない場合「_」に分岐します。
match文の文法
match 変数 {
値1 => { ステートメント },
値2 => { ステートメント },
_ => { ステートメント }
}
fn main() { let s = "マッチ"; match s { "パターン" => { println!("パターン"); }, "マッチ" => { println!("マッチ"); }, _ => { println!("それら以外") } } }
構造体とプロパティとメソッド
一般のプログラミング言語はオブジェクト指向に「クラス(class)」を使いますが、Rustでは「構造体(struct)」を使います。「struct 構造体名」のスコープ内に「プロパティ(構造体に属する変数)」を書きます。
「impl 構造体名」のスコープ内に「メソッド(構造体に属する関数)」を書きます。「new」メソッドは所謂「コンストラクタ」でインスタンスを生成する際に呼び出します。
他にもプログラミング言語「Java」の「interface」に似た「トレイト」という機能もありますが、本連載では使わないので省略します。
構造体の文法
struct 構造体名 {
プロパティ: データ型,
プロパティ: データ型,
}
impl 構造体名 {
fn new(引数:データ型) -> Self {
構造体名 {
プロパティ: 値,
プロパティ: 値
}
}
fn メソッド名(self,引数:データ型) -> 戻り値 {
ステートメント
戻り値
}
}
struct Car { speed: i32, max: i32, } impl Car { fn new(spd: i32,mx: i32) -> Self { Car { speed: spd, max: mx } } fn get_speed(mut self) -> i32 { // 後で値が変更されるので「mut」を付ける if self.speed > self.max { self.speed = self.max; } self.speed } } fn main() { let car = Car::new(140,100); println!("スピード{}km/h",car.get_speed()); }