如何在RUST中打印变量的类型?

我有以下情况:

let mut my_number = 32.90;

如何打印my_number?

使用typetype_of不起作用。还有别的方法可以打印号码的字体吗?


慕桂英546537
浏览 2214回答 4
4回答

萧十郎

如果你只是想找出变量的类型,并且愿意在编译时这样做,您可以导致一个错误并让编译器来获取它。例如,将变量设置为无法工作的类型&nbsp;(let () = x;):error[E0308]:&nbsp;mismatched&nbsp;types &nbsp;-->&nbsp;<anon>:2:29 &nbsp;&nbsp;| 2&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;mut&nbsp;my_number:&nbsp;()&nbsp;=&nbsp;32.90; &nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^^^^^&nbsp;expected&nbsp;(),&nbsp;found&nbsp;floating-point&nbsp;variable &nbsp;&nbsp;| &nbsp;&nbsp;=&nbsp;note:&nbsp;expected&nbsp;type&nbsp;`()` &nbsp;&nbsp;=&nbsp;note:&nbsp;&nbsp;&nbsp;&nbsp;found&nbsp;type&nbsp;`{float}` error:&nbsp;aborting&nbsp;due&nbsp;to&nbsp;previous&nbsp;error或者在大多数情况下调用无效方法或获取无效字段:error:&nbsp;no&nbsp;method&nbsp;named&nbsp;`what_is_this`&nbsp;found&nbsp;for&nbsp;type&nbsp;`{float}`&nbsp;in&nbsp;the&nbsp;current&nbsp;scope &nbsp;-->&nbsp;<anon>:3:15 &nbsp;&nbsp;| 3&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_number.what_is_this(); &nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^^^^^^^^^^^^ error:&nbsp;aborting&nbsp;due&nbsp;to&nbsp;previous&nbsp;errorerror:&nbsp;attempted&nbsp;access&nbsp;of&nbsp;field&nbsp;`what_is_this`&nbsp;on&nbsp;type&nbsp;`{float}`,&nbsp;but&nbsp;no&nbsp;field&nbsp;with&nbsp;that&nbsp;name&nbsp;was&nbsp;found &nbsp;-->&nbsp;<anon>:3:5 &nbsp;&nbsp;| 3&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_number.what_is_this &nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^^^^^^^^^^^^^^^^^^^^^^ error:&nbsp;aborting&nbsp;due&nbsp;to&nbsp;previous&nbsp;error这些都揭示了类型,在这种情况下,这种类型实际上还没有完全解决。在第一个例子中,它被称为“浮点变量”,并且{float}“在所有三个示例中,这是一个部分解析的类型,可能会以f32或f64,取决于你如何使用它。“{float}不是合法的类型名称,它是一个占位符,意思是“我不完全确定这是什么”,但它是浮点数。在浮点变量的情况下,如果不对其进行约束,它将默认为f641,1。(非限定整数文字默认为i32.)可能仍有一些方法使编译器感到困惑,使编译器无法在两者之间作出决定。f32和f64我不确定。它过去很简单32.90.eq(&32.90),但这两者都被视为f64现在快乐地向前走,所以我不知道。

Cats萌萌

有一个不稳定的函数std::intrinsics::type_name这可以为您提供一个类型的名称,尽管您必须使用一个夜间构建的RUST(这不太可能在稳定锈蚀中起作用)。下面是一个例子:#![feature(core_intrinsics)]fn&nbsp;print_type_of<T>(_:&nbsp;&T)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;unsafe&nbsp;{&nbsp;std::intrinsics::type_name::<T>()&nbsp;});}fn&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;print_type_of(&32.90);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;prints&nbsp;"f64" &nbsp;&nbsp;&nbsp;&nbsp;print_type_of(&vec![1,&nbsp;2,&nbsp;4]);&nbsp;&nbsp;//&nbsp;prints&nbsp;"std::vec::Vec<i32>" &nbsp;&nbsp;&nbsp;&nbsp;print_type_of(&"foo");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;prints&nbsp;"&str"}

侃侃无极

如果事先知道所有类型,则可以使用特征添加type_of方法:trait&nbsp;TypeInfo&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;type_of(&self)&nbsp;->&nbsp;&'static&nbsp;str;}impl&nbsp;TypeInfo&nbsp;for&nbsp;i32&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;type_of(&self)&nbsp;->&nbsp;&'static&nbsp;str&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"i32" &nbsp;&nbsp;&nbsp;&nbsp;}}impl&nbsp;TypeInfo&nbsp;for&nbsp;i64&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;type_of(&self)&nbsp;->&nbsp;&'static&nbsp;str&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"i64" &nbsp;&nbsp;&nbsp;&nbsp;}}//...没有复杂或没有‘,所以,虽然更有限,这是这里唯一的解决方案,得到一个字符串,是稳定的。但是,它非常辛苦,不考虑类型参数,所以我们可以.trait&nbsp;TypeInfo&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;type_name()&nbsp;->&nbsp;String; &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;type_of(&self)&nbsp;->&nbsp;String;}macro_rules!&nbsp;impl_type_info&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;($($name:ident$(<$($T:ident),+>)*),*)&nbsp;=>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(impl_type_info_single!($name$(<$($T),*>)*);)* &nbsp;&nbsp;&nbsp;&nbsp;};}macro_rules!&nbsp;mut_if&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;($name:ident&nbsp;=&nbsp;$value:expr,&nbsp;$($any:expr)+)&nbsp;=>&nbsp;(let&nbsp;mut&nbsp;$name&nbsp;=&nbsp;$value;); &nbsp;&nbsp;&nbsp;&nbsp;($name:ident&nbsp;=&nbsp;$value:expr,)&nbsp;=>&nbsp;(let&nbsp;$name&nbsp;=&nbsp;$value;);}macro_rules!&nbsp;impl_type_info_single&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;($name:ident$(<$($T:ident),+>)*)&nbsp;=>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;impl$(<$($T:&nbsp;TypeInfo),*>)*&nbsp;TypeInfo&nbsp;for&nbsp;$name$(<$($T),*>)*&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;type_name()&nbsp;->&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mut_if!(res&nbsp;=&nbsp;String::from(stringify!($name)),&nbsp;$($($T)*)*); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.push('<'); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.push_str(&$T::type_name()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.push(','); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.pop(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.push('>'); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;type_of(&self)&nbsp;->&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$name$(::<$($T),*>)*::type_name() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}impl<'a,&nbsp;T:&nbsp;TypeInfo&nbsp;+&nbsp;?Sized>&nbsp;TypeInfo&nbsp;for&nbsp;&'a&nbsp;T&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;type_name()&nbsp;->&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;mut&nbsp;res&nbsp;=&nbsp;String::from("&"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.push_str(&T::type_name()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;type_of(&self)&nbsp;->&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<&T>::type_name() &nbsp;&nbsp;&nbsp;&nbsp;}}impl<'a,&nbsp;T:&nbsp;TypeInfo&nbsp;+&nbsp;?Sized>&nbsp;TypeInfo&nbsp;for&nbsp;&'a&nbsp;mut&nbsp;T&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;type_name()&nbsp;->&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;mut&nbsp;res&nbsp;=&nbsp;String::from("&mut&nbsp;"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res.push_str(&T::type_name()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;fn&nbsp;type_of(&self)&nbsp;->&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<&mut&nbsp;T>::type_name() &nbsp;&nbsp;&nbsp;&nbsp;}}macro_rules!&nbsp;type_of&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;($x:expr)&nbsp;=>&nbsp;{&nbsp;(&$x).type_of()&nbsp;};}让我们使用它:impl_type_info!(i32,&nbsp;i64,&nbsp;f32,&nbsp;f64,&nbsp;str,&nbsp;String,&nbsp;Vec<T>,&nbsp;Result<T,S>)fn&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;type_of!(1)); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;type_of!(&1)); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;type_of!(&&1)); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;type_of!(&mut&nbsp;1)); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;type_of!(&&mut&nbsp;1)); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;type_of!(&mut&nbsp;&1)); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;type_of!(1.0)); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;type_of!("abc")); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;type_of!(&"abc")); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;type_of!(String::from("abc"))); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;type_of!(vec![1,2,3])); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;<Result<String,i64>>::type_name()); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;<&i32>::type_name()); &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;<&str>::type_name());}产出:i32 &i32 &&i32 &mut&nbsp;i32 &&mut&nbsp;i32 &mut&nbsp;&i32 f64 &str &&str String Vec<i32> Result<String,i64> &i32 &str铁锈游乐场

料青山看我应如是

UPD以下内容不再有效。查帐舒布姆的回答为了改正。检查std::intrinsics::get_tydesc<T>()..它现在处于“试验性”状态,但如果你只是对类型系统进行黑客攻击,那就没问题了。请查看以下示例:fn&nbsp;print_type_of<T>(_:&nbsp;&T)&nbsp;->&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;type_name&nbsp;= &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsafe&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*std::intrinsics::get_tydesc::<T>()).name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;println!("{}",&nbsp;type_name);}fn&nbsp;main()&nbsp;->&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;mut&nbsp;my_number&nbsp;=&nbsp;32.90; &nbsp;&nbsp;&nbsp;&nbsp;print_type_of(&my_number);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;prints&nbsp;"f64" &nbsp;&nbsp;&nbsp;&nbsp;print_type_of(&(vec!(1,&nbsp;2,&nbsp;4)));&nbsp;//&nbsp;prints&nbsp;"collections::vec::Vec<int>"}这就是内部使用实施著名的{:?}格式化程序。
打开App,查看更多内容
随时随地看视频慕课网APP