1週あけての第49回です。前回はこちら。
[第49回の様子]
2022/08/03に第49回を開催した。
内容としてはRust By Example 日本語版の16. トレイトの続きで、「16.1. 継承(Derive)」、「16.2. Returning Traits with dyn」に取り組んだ。
参加者は自分を入れて5人。ちょっと遅れてもちゃんと参加してくれてありがたい。
[学んだこと]
- 16.1. 継承(Derive)
[#derive]
アトリビュートを使うことで、標準的なトレイトの実装を利用できる- Eq、Clone、Copy、Debugなどが利用できる
// `Inches`はプリント可能なタプルになる #[derive(Debug)] struct Inches(i32); fn main() { let foot = Inches(12); println!("One foot equals {:?}", foot); // One foot equals Inches(12) }
- PartialEqトレイトを使うと比較演算が可能になる
// `Centimeters`は比較可能なタプル #[derive(PartialEq, PartialOrd)] struct Centimeters(f64); #[derive(Debug)] struct Inches(i32); impl Inches { fn to_centimeters(&self) -> Centimeters { let &Inches(inches) = self; Centimeters(inches as f64 * 2.54) } } fn main() { let foot = Inches(12); let meter = Centimeters(100.0); let cmp = if foot.to_centimeters() < meter { "smaller" } else { "bigger" }; println!("One foot is {} than one meter.", cmp);} // smaller }
- Defaultトレイトというのもあるらしい
- 自動的にデフォルト値が入った構造体が作れるのは便利かも。
#[derive(Default, Debug)] struct SomeOptions { foo: i32, bar: f32, } fn main() { let options: SomeOptions = Default::default(); println!("{:?}", options); // SomeOptions { foo: 0, bar: 0.0 } }
- 16.2. Returning Traits with dyn
- Rustコンパイラはメモリ確保のために、Traitではなく具象型を関数の返り値の型として必要とするらしい
- なので、Animalトレイトがあった場合、関数の返り値の型にこれをそのまま利用することはできず、ヒープメモリ上のデータを指すBoxを利用して、
Box<dyn Animal>
のように書く必要がある
// 具象型 struct Sheep {} struct Cow {} // トレイト trait Animal { // インスタンスメソッド fn noise(&self) -> &'static str; } impl Animal for Sheep { fn noise(&self) -> &'static str { "baaaaah!" } } impl Animal for Cow { fn noise(&self) -> &'static str { "moooooo!" } } // Animalトレイトを実装した型へのポインタを返す関数 fn random_animal(random_number: f64) -> Box<dyn Animal> { if random_number < 0.5 { Box::new(Sheep {}) } else { Box::new(Cow {}) } } fn main() { let random_number = 0.234; let animal = random_animal(random_number); // Boxでラップした型のメソッドを直接呼び出せる println!("You've randomly chosen an animal, and it says {}", animal.noise()); // baaaaah!(Sheepが返る) }
- このへんは以前Rustでインタプリタ言語を実装しようとしてハマった部分...苦手意識が強いのでじっくり理解していきたいところ。
[まとめ]
モブプログラミングスタイルでRust dojoを開催した。
トレイトの基本を押さえた。この辺はまだ比較的簡単...。
プルリクエストはそのうち追記予定。
[2022/08/10追記]