我不是要编写复杂的代码,我只是想了解这里发生了什么(或不发生了什么)。我检查了其他问题,但它们都有复杂的情况,我认为这种情况是迄今为止最简单的。

我有以下代码:

let one_step: f32 = "4.0".parse().unwrap();
let extra_step: u32 = one_step as u32;

println!("{:?}", extra_step);

在我看来,我们有一个 &str ,我们将它解析为 f32 并解开它。然后我们将 f32 转换为 u32

为什么我不能这样做?实际上,这不是同一件事吗?
let single_step: u32 = "4.0".parse().unwrap() as u32;

println!("{:?}", single_step);

如果我尝试运行此代码,则会收到此错误:

error[E0619]: the type of this value must be known in this context
 --> src/main.rs:6:27
  |
6 |     let single_step: u32 = "4.0".parse().unwrap() as u32;
  |                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

看起来有些事情需要我们将操作分成两个块。

最佳答案

问题是 parse 不仅仅是为 f32 定义的。 parse 可以定义所有类型(特别是任何实现 FromStr 的类型)。那么 Rust 如何知道 parse 应该返回 f32 而不是其他类型?

在您的第一个示例中,它知道这一点,因为 oneStep 被声明为具有 f32 类型,因此 Rust 可以推断它应该使用 parse 作为其类型参数调用 f32 。在第二个例子中 f32 没有在代码的任何地方提到,所以 Rust 不可能弄清楚。

除了从变量的类型推断类型参数之外,您还可以直接传递它。这样它只需一步即可工作:

let singleStep: u32 = "4.0".parse::<f32>().unwrap() as u32;

关于types - 为什么在将字符串解析为数字时会出现 "the type of this value must be known in this context"错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49656792/

10-09 03:44