Rust dojo第16回を開催した

第16回です。

前回はこちら。

kdnakt.hatenablog.com

 

 

[第16回の様子]

2021/10/27に第16回を開催した。

 

内容としてはRust By Example 日本語版の「5.2. リテラル」、「5.3. 型推論」に取り組んだ。

 

参加者はまたちょっと増えて、全部で10人。

 

Slackでの書き込みは相変わらず少なめだが、dojo開催中の会話が増えてきて、よい雰囲気。

 

[学んだこと]

let x = 1u8; // u8型の1
let y = 2u32;// u32型の2
let z = 3f32;// f32型の3
  • サフィックスを指定しない場合、通常、整数型はi32、浮動小数点型はf64となる
  • ただし、使用方法によっては型が異なる
let f = 1.0; // 通常はf64型だが...
let z = 3f32;
let f2 = f * z; // zと型が一致して、fもf32型になる

// &変数で値ではなく参照を渡す println!("size of `z` in bytes: {}", std::mem::size_of_val(&z)); // size of `z` in bytes: 4 (32ビット=4バイト) println!("size of `f` in bytes: {}", std::mem::size_of_val(&f)); // size of `f` in bytes: 4
// この時点では何型のベクトルかわからない
let mut vec = Vec::new();

let e = 5u8;
vec.push(e); // これによりu8型のベクトル(Vec<u8>)と決まる
fn main() {
  let mut vec = Vec::new();
}

// 以下のエラー
error[E0282]: type annotations needed for `Vec<T>`
 --> src/main.rs:8:19
  |
8 |     let mut vec = Vec::new();
  |         -------   ^^^^^^^^ cannot infer type for type parameter `T`
  |         |
  |         consider giving `vec` the explicit type `Vec<T>`, where the type parameter `T` is specified
  • Rustではヒンドリー-ミルナー型推論(Hindley-Milner型推論)をベースにしているらしい
    • 先の例のように、型を書かなくてもコンパイラが推論してくれるが、型が全然ないと可読性が落ちるので、関数定義には型を書くのが必須となっている
    • 変数には型を書かなくてもコンパイルできるが、長い関数などで型がわかりづらくなるケースもあるので、適切に関数を切り出すと良さそう
    • 機械的に型をつけてくれるツールもあるらしい

 

[まとめ]

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

Rustの型にちょっと詳しくなった!

 

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

github.com