1.38からstd::any::type_nameという関数を使って型の名前を取得することができるようになりました。
fn print_typename<T>(_: T) {
println!("{}", std::any::type_name::<T>());
}
fn main() {
let a = 42;
print_typename(a);
let b = |x: i32| { x * 2 };
print_typename(b);
let c = (1..10).skip(2);
print_typename(c);
}
これをplaygroundで実行すると以下のように出力されます。
i32
playground::main::{{closure}}
core::iter::adapters::Skip<core::ops::range::Range<i32>>
型名を取得できるのはデバッグや学習用に便利かもしれません。ちなみに、std::any::type_nameの返す文字列はコンパイラのバージョンアップで変更の可能性があり、また一意であることも保証されないそうです。