kdnakt blog

hello there.

Rust dojo第6回が開催された

第6回です。

前回はこちら。

kdnakt.hatenablog.com

 

 

[第6回の様子]

2021/08/18に第6回が開催された。

 

タイトルがいつもと違うのにお気づきだろうか。今回諸事情により前のミーティングが長引いた結果、主催者たる私がRust dojoに参加できなかった。無念。

しかし、主催者がいなくともいつものメンバーで(きっと主催者の不在を嘆きながら)進めてくれたようだ。

 

内容としてはRust By Example 日本語版の「2. 基本データ型」を復習して、「2.1. リテラルとオペレータ」読んで手を動かした(らしい)。

 

参加者はたぶん全部で8人(と聞いている)。今日もなかなか盛況だった(ようだ)。

 

今回も、前回終了時に決めておいたメンバーに初ドライバーをお願いした。ドライバー指名制度はうまくいっているようで、次とその次の回のドライバーが決まったらしい。もしかして私がいない方がスムーズ...?😭

 

今週も開催前後のSlackでのやりとりがたくさん🎉

 

Dojo中にも書き込みが。なるほどそういうところが気になる感じね。

f:id:kidani_a:20210818234247p:plain

f:id:kidani_a:20210818234340p:plain

 

ドライバーやナビゲータからの参加報告。

f:id:kidani_a:20210818234828p:plain

f:id:kidani_a:20210818234936p:plain

f:id:kidani_a:20210818234442p:plain

 

新しいメンバーが増えた!やったね!

f:id:kidani_a:20210818234540p:plain

 

Rust.tokyoというイベントがあるらしい。気になる。

f:id:kidani_a:20210818234640p:plain

rust.tokyo

 

次は一緒に...。😭

f:id:kidani_a:20210818235033p:plain

 

[学んだこと]

0b0101 // 2進数で5
0o0101 // 8進数で65
0x0101 // 16進数で257
  • 可読性のため、数値リテラルにはアンダースコアを利用できる(この辺はJava 7以降でも同じ
    • 1_0001000と同じ
    • 0.000_0010.000001と同じ
  • 演算子と実行順序については公式ドキュメントへのリンクがあった

doc.rust-lang.org

    • C言語などと大体同じらしい。
    • asとか..とかやや見慣れないのもあるけど多分そのうち説明あるだろう...
  • ここからはサンプルコードを動かして学んでいく
  • 型が違うと演算できずにコンパイルエラーになる
println!("1 + 2 = {}", 1u32 + 2);
// 1 + 2 = 3
// 

// 違う型同士で演算しようとすると
println!("1 + 2 = {}", 1u32 + 2i32); // コンパイルエラー
// 5 |     println!("1 + 2 = {}", 1u32 + 2i32); 
//   |                                   ^^^^ expected `u32`, found `i32`
// error[E0277]: cannot add `i32` to `u32`
//  --> src/main.rs:5:33
//   |
// 5 |     println!("1 + 2 = {}", 1u32 + 2i32); 
//   |                                 ^ no implementation for `u32 + i32`
//   |
//   = help: the trait `Add<i32>` is not implemented for `u32`
  • また、オーバーフローもチェックしてくれる
println!("1 - 2 = {}", 1i32 - 2);
// 1 - 2 = -1

// 型を符号なし整数に変更する
println!("1 - 2 = {}", 1u32 - 2); // コンパイルエラー
//  |
//8 |     println!("1 - 2 = {}", 1u32 - 2);
//  |                            ^^^^^^^^ attempt to compute `1_u32 - 2_u32`, which would overflow
//  |
//  = note: `#[deny(arithmetic_overflow)]` on by default

// オーバーフローしない場合は実行できる
println!("1 - 1 = {}", 1u32 - 1);
// 1 - 1 = 0
println!("true AND false is {}", true && false);
// true AND false is false

println!("true OR false is {}", true || false);
// true OR false is true

println!("NOT true is {}", !true);
// NOT true is false
  • ビット演算もできる
// 論理積
println!("0011 AND 0101 is {:04b}", 0b0011u32 & 0b0101);
// 0011 AND 0101 is 0001

// 論理和
println!("0011 OR 0101 is {:04b}", 0b0011u32 | 0b0101);
// 0011 OR 0101 is 0111

// 排他的論理和
println!("0011 XOR 0101 is {:04b}", 0b0011u32 ^ 0b0101);
// 0011 XOR 0101 is 0110

// 左シフト
println!("1 << 5 is {}", 1u32 << 5);
// 1 << 5 is 32

// 右シフト
println!("0x80 >> 2 is 0x{:x}", 0x80u32 >> 2);
// 0x80 >> 2 is 0x20

 

[まとめ]

モブプログラミングスタイルでRust dojoを開催した。

これで演算子マスター!

 

今週のプルリクエストはこちら。

github.com