std::any::type_name はバッチリ型名を返してくれるわけではなさそう

qiita.com

こちらを見て本当にクロージャかなと色々試していて気づいたこと
(記事の内容はあんまり関係ありません)

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

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a16e3e2ec6b2e41aad376ec378b580b3

また、関数を渡すと関数名が返ってきます。

print_typeof(&main); // => playground::main

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=2321f4d670ddb136afd2d021ac578b96

この挙動が紛らわしく、

#[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
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=576a8f71ef69b2bdb49d08c06ae083d9

この挙動の理解に時間がかかってしまったというお話でした。 タプル構造体Dataのコンストラクタの関数の型はDataなのか????と思ってしまったというお話