我不是想编写复杂的代码,我只是想了解这里发生了什么(或不是什么).我检查了其他问题,但他们都有复杂的情况,我认为这种情况到目前为止最简单.
我有以下代码:
let one_step: f32 = "4.0".parse().unwrap();
let extra_step: u32 = one_step as u32;
println!("{:?}", extra_step);
Run Code Online (Sandbox Code Playgroud)
我看到它的方式,我们有一个&str,我们解析它f32并解开它.然后我们将其转换f32为a u32.
为什么我不能这样做?实际上,这不是同一件事吗?
let single_step: u32 = "4.0".parse().unwrap() as u32;
println!("{:?}", single_step);
Run Code Online (Sandbox Code Playgroud)
如果我尝试运行此代码,我会收到此错误:
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;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
看起来有些东西要求我们将操作分成两个块.
事情是,这parse不仅仅是为了定义f32.parse可以定义所有类型(特别是任何实现的类型FromStr).那么Rust怎么知道parse应该返回f32而不是其他类型呢?
在你的第一个例子就知道这一点,因为oneStep被声明为有型f32,所以锈病可以推断,它应该调用parse以f32作为其类型参数.在第二个例子f32中没有在代码中的任何地方提到过,所以Rust无法弄明白.
您可以直接传递它,而不是从变量类型推断类型参数.这样它只需一步即可:
let singleStep: u32 = "4.0".parse::<f32>().unwrap() as u32;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |