第37回です。前回はこちら。
[第37回の様子]
2022/04/27に第37回を開催した。
内容としてはRust By Example 日本語版の「14. ジェネリクス」、「14.1. 関数」、「14.2. メソッド」に取り組んだ。
参加者は確か6人くらい。安定していて良い。
[学んだこと]
- 14. ジェネリクス
- Go言語に最近実装されたと話題のジェネリクス。Rustでの扱いについて見ていく。
- Javaなどと同様、ジェネリクスは
<T>
のように書き、型パラメータなどに利用される- ジェネリクスの反対は具象型(concrete)
- Rustの場合、ジェネリックな型パラメータを受け付ける関数をジェネリック関数と呼ぶ
// ジェネリック関数の例 // 直前でTという1文字の具象型が定義されていても<T>によってジェネリクスとなる fn foo<T>(arg: T) { ... }
- 構造体もジェネリック型となる
#[derive(Debug)] struct SingleGen<T>(T); fn main() { // 明示的な型指定 let _char: SingleGen= SingleGen('a'); println!("{:?}", _char); // 暗黙の型指定 let _i32 = SingleGen(6); println!("{:?}", _i32); }
struct SGen<T>(T); fn generic<T>(_s: SGen<T>) {} fn main() { generic::<char>(SGen('a')); }
- 14.2. メソッド
- implブロックでもジェネリクスを利用できる
struct GenericVal<T>(T);
// f32型の場合のメソッドを定義 impl GenericVal<f32> {}
- ジェネリクスのままメソッドを実装する場合はimpl <T>〜のように書く
struct GenVal<T> { gen_val: T, } impl<T> GenVal<T> { fn value(&self) -> &T { &self.gen_val } } fn main() { let y = GenVal { gen_val: 3i32 }; println!("{}", y.value()); }
[まとめ]
モブプログラミングスタイルでRust dojoを開催した。
ジェネリクス便利そうだけど、ターボフィッシュ構文に慣れない感じがする...。
今週のプルリクエストはこちら。