第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を開催した。
ジェネリクス便利そうだけど、ターボフィッシュ構文に慣れない感じがする...。
今週のプルリクエストはこちら。