第19回です。
前回はこちら。
[第19回の様子]
2021/11/24に第19回を開催した。
内容としてはRust By Example 日本語版の「7. 式」、「8. 条件分岐」、「8.1. if/else」、「8.2. loop」、「8.2.1. ネストとラベル」、「8.2.2. loopが返す値」に取り組んだ。
今週はテキストが短めだったのでサクサク進んだ。
参加者はうろ覚えだが、多分前回と同じくらいで、8人ほど。
[学んだこと]
- 7. 式
- 宣言文にはいくつかの種類がある:よくあるのは、変数束縛と;つきの式
fn main() {
// 変数束縛(variable)
let x = 5;
// 式;(expression)
x;
x + 1;
15;
}
- コードブロック(
{ ... })も式の一種:ブロック丸ごと値として扱うことができる
fn main() {
let x = 5u32;
let y = {
let x_squared = x * x;
let x_cube = x_squared * x;
// この式は`y`に代入される
x_cube + x_squared + x
};
}
- コードブロックの最後の式が
;で終わる場合の返り値は()(ユニット)になる
fn main() {
let x = 5u32;
let z = {
2 * x;
};
println!("z is {:?}", z);
// z is ()
}
- 8. 条件分岐
- 処理の流れをコントロールするための、if/else、forなどの文法を見ていく
- 8.1. if/else
- Rustの条件式はカッコが不要
fn main() {
let n = 5;
if n < 0 {
print!("{} is negative", n);
} else if n > 0 {
print!("{} is positive", n);
} else {
print!("{} is zero", n);
}
}
- if/elseも式の一種なので、代入できる
fn main() {
let n = 5;
let big_n =
if n < 10 && n > -10 {
println!(", and is a small number, increase ten-fold");
10 * n
} else {
println!(", and is a big number, halve the number");
n / 2
};
println!("{} -> {}", n, big_n);
// 5 -> 50
}
- 8.2. loop
- 無限ループを作成するための
loopキーワードがある while trueと同じだが、ループのたびの条件判定がなくなるので若干高速になる- ループから抜け出す
break、次のループにうつるcontinueが使える
fn main() {
let mut count = 0u32;
loop {
count += 1;
if count == 3 {
println!("three");
continue;
}
println!("{}", count);
if count == 5 {
println!("OK, that's enough");
break;
}
}
}
// 出力結果は以下の通り
// 1
// 2
// three
// 4
// 5
// OK, that's enough
- 8.2.1. ネストとラベル
loopにはラベル('mylabel:)をつけられるbreak/continue時にラベルを指定して処理できる
#![allow(unreachable_code)]
fn main() {
'outer: loop {
println!("Entered the outer loop");
'inner: loop {
println!("Entered the inner loop");
// 外側を中断
break 'outer;
}
println!("This point will never be reached");
}
println!("Exited the outer loop");
}
// 出力結果は以下の通り
// Entered the outer loop
// Entered the inner loop
// Exited the outer loop
- cotinue版はこんな感じ
fn main() {
let mut count = 0u32;
'outer: loop {
count += 1;
'inner: loop {
if count == 3 {
println!("three");
break 'outer;
} else {
println!("{}", count);
continue 'outer;
}
}
}
}
// 出力結果は以下の通り
// 1
// 2
// three
- 8.2.2. loopが返す値
- loopも式:breakで値を返すことができる
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2; // breakで値を返す
}
};
println!("{}", counter); // 20
}
[まとめ]
モブプログラミングスタイルでRust dojoを開催した。
基本的なif/elseがやっと出てきた...!
今週はプルリクエストなし。