はじめに
こんにちは。細々とプログラミングをしているsotanengelです。
この記事は以下の記事の連載です。
他の連載記事 (詳細)
- Day 1:型システムを使ってデータ構造を再現しよう
- Day 2:型システムを用いて共通の挙動を表現しよう
- Day 3:OptionとResultに対してはmatchを用いずに変換しよう
- Day 4:標準のErrorを使おう
- Day 5:型変換を理解しよう
- Day 6:newtypeパターンを活用しよう
- Day 7:複雑な型にはビルダを使おう
- Day 8:明示的なループの代わりにイテレータ変換を使用することを検討しよう
- Day 9:標準トレイトに習熟しよう
- Day 10:RIIパターンにはDropトレイトを実装しよう
- Day 11:ジェネリクスとトレイトオブジェクトのトレードオフを理解しよう
- Day 12:デフォルト実装を用いて、実装しなければならないトレイトメソッドを最小限にしよう
- Day 13:Don't panic
- Day 14:リフレクションを避けよう
- Day 15:可視範囲を最小化しよう
また本記事はEffective Rust(David Drysdale (著), 中田 秀基 (翻訳))を参考に作成されております。とてもいい書籍ですので興味を持った方は、ぜひ読んでみてください!
今日の内容
概要
Rustにはリフレクション(アイテムの型や内容を出力する行為)の一部をサポートしていませんが、他の機能でカバーすることができます。その方法について学びましょう。
グローバルにユニークなIDを取得しよう
問(リンク)
Anyトレイトの機能を使って、グローバルに固有なIDを取得しましょう。
コード (詳細)
use std::any::Any;
// TODO: TにAnyトレイト境界を設けて、グローバルにユニークな識別子(数値)を出力するようにしてください。
fn print_type_id<T>(value: &T) {
let type_id;
let type_id = println!("The TypeId of the value is: {:?}", type_id);
}
fn main() {
let value1 = 42;
let value2 = "Hello, Rust!";
let value3 = 3.14;
print_type_id(&value1);
print_type_id(&value2);
print_type_id(&value3);
}
解答(リンク)
コード参照。
ただし、Anyを使った方法ではTが'static
ではない生存期間でない参照を含んでいると、Tに対して実装されない。
※生存期間≒型の一部のため
コード (詳細)
use std::any::Any;
fn print_type_id<T: Any>(value: &T) {
let type_id = value.type_id();
println!("The TypeId of the value is: {:?}", type_id);
}
fn main() {
let value1 = 42;
let value2 = "Hello, Rust!";
let value3 = 2.468;
print_type_id(&value1);
print_type_id(&value2);
print_type_id(&value3);
}
さいごに
もしも本リポジトリで不備などあれば、リポジトリのissueやPRなどでご指摘いただければと思います。