第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がやっと出てきた...!
今週はプルリクエストなし。