猿问

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

我有以下情况:

let mut my_number = 32.90;

如何打印my_number?

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


元芳怎么了
浏览 1535回答 4
4回答

精慕HU

如果你只是想找出变量的类型,并且愿意在编译时这样做,您可以导致一个错误并让编译器来获取它。例如,将变量设置为无法工作的类型&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现在快乐地向前走,所以我不知道。

繁花如伊

有一个不稳定的函数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"}

慕尼黑5688855

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
我要回答