当前位置: 首页 > 知识库问答 >
问题:

如何打印变量的类型?

农存
2023-03-14

我有以下几点:

let mut my_number = 32.90;

如何打印my_number的类型?

使用typetype_of不起作用。还有其他方法可以打印号码的类型吗?

共有3个答案

公羊招
2023-03-14

有一个不稳定的函数std::intrinsics::type_name,可以获取类型的名称,尽管你必须使用每晚构建的Rust(这在稳定的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"
}
潘泰
2023-03-14

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

例如,将变量设置为不起作用的类型:

let mut my_number: () = 32.90;
// let () = x; would work too
error[E0308]: mismatched types
 --> src/main.rs:2:29
  |
2 |     let mut my_number: () = 32.90;
  |                             ^^^^^ expected (), found floating-point number
  |
  = note: expected type `()`
             found type `{float}`

或调用无效的方法:

let mut my_number = 32.90;
my_number.what_is_this();
error[E0599]: no method named `what_is_this` found for type `{float}` in the current scope
 --> src/main.rs:3:15
  |
3 |     my_number.what_is_this();
  |               ^^^^^^^^^^^^

或访问无效字段:

let mut my_number = 32.90;
my_number.what_is_this
error[E0610]: `{float}` is a primitive type and therefore doesn't have fields
 --> src/main.rs:3:15
  |
3 |     my_number.what_is_this
  |               ^^^^^^^^^^^^

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

另见:

  • 编译器错误消息中的{整数}或{浮点}是什么?

可能仍然有一些方法让编译器感到困惑,以至于它不能在f32f64之间做出决定;我不确定。它曾经简单到32.90.eq(

麹权
2023-03-14

您可以使用std::any::type_name函数。这不需要每晚编译或外部机箱,结果非常正确:

fn print_type_of<T>(_: &T) {
    println!("{}", std::any::type_name::<T>())
}

fn main() {
    let s = "Hello";
    let i = 42;

    print_type_of(&s); // &str
    print_type_of(&i); // i32
    print_type_of(&main); // playground::main
    print_type_of(&print_type_of::<i32>); // playground::print_type_of<i32>
    print_type_of(&{ || "Hi!" }); // playground::main::{{closure}}
}

请注意:如留档中所述,此信息只能用于调试目的:

这是用于诊断的。字符串的确切内容和格式没有指定,只是作为类型的最佳描述。

如果希望在不同的编译器版本之间保持类型表示不变,则应该使用一个特征,如PHCR的答案中所示。

 类似资料:
  • 使用和不起作用。有没有别的办法我可以打印号码的类型?

  • 问题内容: 有没有一种方法可以快速打印变量的运行时类型?例如: 在上面的示例中,我正在寻找一种方法来表明变量“ soon”的类型为,或至少为。 问题答案: 2016年9月更新 Swift 3.0:使用,例如(因为关键字已删除) 2015年10月更新 : 我将下面的示例更新为新的Swift 2.0语法(例如,已被替换为,现在是)。 从Xcode 6.3发行说明 : @nschum在注释中指出Xcod

  • 在Python中,变量根据其内容具有真实值。例如: 我还知道,我可以在根本不使用if运算符的情况下打印比较的真实值: 但是我如何打印变量的/值?目前,我正在这样做: 但这看起来有点不优雅。有没有首选的方式?

  • 问题内容: Go中有类似Ruby的东西吗? 例如,在Ruby中,您可以编写: 输出将是: 我能找到的最接近的东西是 问题答案: 如果您的目标是避免导入第三方软件包,则另一个选择是使用json.MarshalIndent: 输出: 工作示例:http : //play.golang.org/p/SNdn7DsBjy

  • 问题内容: 假设我有一个名为choice它的变量等于2。我将如何访问该变量的名称?相当于 用于制作字典。有一个很好的方法可以做到这一点,而我只是想念它。 编辑: 因此,这样做的原因是。我正在运行一些数据分析的东西,我在运行时使用多个我想调整或不调整的参数来调用程序。我从格式为.config的文件中读取了上次运行中使用的参数 当提示你输入值时,将显示先前使用的值,并且空字符串输入将使用先前使用的值。

  • 问题内容: 我想在引号中打印一个变量。我想打印出来 我已经尝试了很多,但有效的方法是: –但是输出中有两个空格-> 当我不使用逗号时,会出现语法错误。 如何在一对引号内打印内容? 问题答案: 您可以使用: 在这里了解格式:格式 在3x中,您可以使用: