std::any::type_name はバッチリ型名を返してくれるわけではなさそう
こちらを見て本当にクロージャかなと色々試していて気づいたこと
(記事の内容はあんまり関係ありません)
std::any::type_name::<T>()
は型引数の名前を返してくれます。
のでこんな形で値を渡すことで、その値の型が(文字列で)得られます
fn print_typeof<T>(_: &T) { println!("{}", std::any::type_name::<T>()); } fn main() { print_typeof(&0u8); // => u8 }
が、そんなに気の利いた関数ではないらしく、
型に別名つけてても無視されます
type NewType = u8; println!("{}", std::any::type_name::<NewType>()); // => u8
また、関数を渡すと関数名が返ってきます。
print_typeof(&main); // => playground::main
この挙動が紛らわしく、
#[derive(Debug)] struct Data(i32); fn print_type_of<T>(x: T) { println!("{}", std::any::type_name::<T>()); } fn main() { print_type_of(Data); // => Playground::Data }
この挙動の理解に時間がかかってしまったというお話でした。 タプル構造体Dataのコンストラクタの関数の型はDataなのか????と思ってしまったというお話