我正在尝试将输入的字符串转换为整数。我知道这可以通过将unwrap
应用于from_str
来完成,但我想我会尝试正确处理错误情况并使用匹配来提取值。而不是它按预期工作我只是得到这个错误......
错误:无法推断出有关
_
的足够类型信息;类型注释必需which points to the
xin
一些(x)`
fn main () {
let ref num = os::args()[1];
match from_str(num.as_slice()) {
Some(x) => println!("{}", x),
None => println!("string cannot be converted to int"),
}
}
我错过了什么?
答案 0 :(得分:4)
让我们看一下the definition of from_str
:
pub fn from_str<A: FromStr>(s: &str) -> Option<A>
您看,返回类型可能是实现FromStr
的任何类型的Option
,例如int
,u8
和IpAddr
。如果您没有明确说明A
是什么,通过将from_str(…)
更改为from_str::<int>(…)
或类似内容,编译器将尝试找出它可能是什么。在这种情况下,它会向前看,x
类型为A
,并且根据x
的使用情况,它也必须实现std::fmt::Show
。没有其他任何东西可以推断。
那么,什么类型实现FromStr
和Show
?它们中有很多,只要不止一个,编译器就不可能决定你的意思,所以它放弃了。
解决方案是通过编写from_str::<int>(num.as_slice())
或类似内容来规定您希望解析该论点的类型。
答案 1 :(得分:2)
from_str
的返回类型是通用的。它可以返回任何实现FromStr
的类型,包含在Option
中。编译器无法根据值的用法推断出您想要的类型,因为println!
也是通用的。它是i32
,f64
,bool
还是其他什么?
您可以在from_str
电话上指定所需的类型:
fn main() {
let ref num = os::args()[1];
match from_str::<i32>(num.as_slice()) {
Some(x) => println!("{}", x),
None => println!("string cannot be converted to int"),
}
}