Rust dojo第19回を開催した

第19回です。

前回はこちら。

kdnakt.hatenablog.com

 

 

[第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 ()
}
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
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がやっと出てきた...!

 

今週はプルリクエストなし。