在将字符串解析为数字时,为什么会出现“在此上下文中必须知道此值的类型”的错误?

时间:2018-04-04 17:14:48

标签: types rust

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

我有以下代码:

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;
  |                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

看起来有些东西要求我们将操作分成两个块。

1 个答案:

答案 0 :(得分:8)

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

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

您可以直接传递变量,而不是从变量类型推断出类型参数。这样,它只需一步即可完成:

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