Types 为什么我会得到这个错误;此值的类型在此上下文中必须是已知的;将字符串解析为数字时?

Types 为什么我会得到这个错误;此值的类型在此上下文中必须是已知的;将字符串解析为数字时?,types,rust,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 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]:此值的类型在此上下文中必须已知
-->src/main.rs:6:27
|
6 |让单步执行:u32=“4.0”。解析().unwrap()为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;
let singleStep:u32=“4.0”。将::().unwrap()解析为u32;

高度相关:在中制作一个可复制的示例是一个很好的做法,这样每个人都可以运行它。此外,是的,命名约定在中。我在哪里可以找到有关“turbofish”的更多信息:?解析文档中只有一些关于它的简单信息,而谷歌没有提供帮助much@OmarAbid传递类型参数只是一种有点奇怪的语法
parse
定义为
parse(){…}
parse::
是一种明确表示
T
应该是
f32
的方法。更直观的语法
parse
会导致
运算符的语法歧义,因此引入了“turbofish”。我不明白。parse未获取任何参数。但我们在这里讨论的是返回类型?@OmarAbid这里的要点是Rust可以从其“环境”推断参数类型,而不仅仅是从传递的参数。如果我们做
x:i32=“5”。parse(),编译器可以推断
T
i32
。关于turbofish,在中有一个简短的介绍,在这里它也被广泛使用。@OmarAbid它得到的是类型参数。正如我所说的,
parse
被定义为
parse()->T{…}
(除非我在前面的评论中意外遗漏了
->T
)。所以我们有0个值参数(
()
),但有一个类型参数
。有时可以推断类型参数,但如果不能,则必须手动提供。