为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

我有以下情况:let mut my_number = 32.90;如何打印my_number?使用type和type_of不起作用。还有别的方法可以打印号码的字体吗?
查看完整描述

4 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

如果你只是想找出变量的类型,并且愿意在编译时这样做,您可以导致一个错误并让编译器来获取它。

例如,将变量设置为无法工作的类型 (let () = x;):

error[E0308]: mismatched types
 --> <anon>:2:29
  |
2 |     let mut my_number: () = 32.90;
  |                             ^^^^^ expected (), found floating-point variable
  |
  = note: expected type `()`
  = note:    found type `{float}`

error: aborting due to previous error

或者在大多数情况下调用无效方法获取无效字段:

error: no method named `what_is_this` found for type `{float}` in the current scope
 --> <anon>:3:15
  |
3 |     my_number.what_is_this();
  |               ^^^^^^^^^^^^

error: aborting due to previous error
error: attempted access of field `what_is_this` on type `{float}`, but no field with that name was found
 --> <anon>:3:5
  |
3 |     my_number.what_is_this
  |     ^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

这些都揭示了类型,在这种情况下,这种类型实际上还没有完全解决。在第一个例子中,它被称为“浮点变量”,并且{float}“在所有三个示例中,这是一个部分解析的类型,可能会以f32f64,取决于你如何使用它。“{float}不是合法的类型名称,它是一个占位符,意思是“我不完全确定这是什么”,但它浮点数。在浮点变量的情况下,如果不对其进行约束,它将默认为f641,1。(非限定整数文字默认为i32.)


可能仍有一些方法使编译器感到困惑,使编译器无法在两者之间作出决定。f32f64我不确定。它过去很简单32.90.eq(&32.90),但这两者都被视为f64现在快乐地向前走,所以我不知道。




查看完整回答
反对 回复 2019-08-05
?
繁花如伊

TA贡献2012条经验 获得超12个赞

有一个不稳定的函数std::intrinsics::type_name这可以为您提供一个类型的名称,尽管您必须使用一个夜间构建的RUST(这不太可能在稳定锈蚀中起作用)。下面是一个例子:

#![feature(core_intrinsics)]fn print_type_of<T>(_: &T) {
    println!("{}", unsafe { std::intrinsics::type_name::<T>() });}fn main() {
    print_type_of(&32.90);          // prints "f64"
    print_type_of(&vec![1, 2, 4]);  // prints "std::vec::Vec<i32>"
    print_type_of(&"foo");          // prints "&str"}




查看完整回答
反对 回复 2019-08-05
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

UPD以下内容不再有效。查帐舒布姆的回答为了改正。

检查std::intrinsics::get_tydesc<T>()..它现在处于“试验性”状态,但如果你只是对类型系统进行黑客攻击,那就没问题了。

请查看以下示例:

fn print_type_of<T>(_: &T) -> () {
    let type_name =
        unsafe {
            (*std::intrinsics::get_tydesc::<T>()).name        };
    println!("{}", type_name);}fn main() -> () {
    let mut my_number = 32.90;
    print_type_of(&my_number);       // prints "f64"
    print_type_of(&(vec!(1, 2, 4))); // prints "collections::vec::Vec<int>"}

这就是内部使用实施著名的{:?}格式化程序。



查看完整回答
反对 回复 2019-08-05
  • 4 回答
  • 0 关注
  • 1443 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信