使用匹配从Option中提取值会导致“无法推断出足够的类型信息...”错误

时间:2014-12-05 06:23:16

标签: rust

我正在尝试将输入的字符串转换为整数。我知道这可以通过将unwrap应用于from_str来完成,但我想我会尝试正确处理错误情况并使用匹配来提取值。而不是它按预期工作我只是得到这个错误......

  

错误:无法推断出有关_的足够类型信息;类型注释必需which points to the x in一些(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"),
    }
}

我错过了什么?

2 个答案:

答案 0 :(得分:4)

让我们看一下the definition of from_str

pub fn from_str<A: FromStr>(s: &str) -> Option<A>

您看,返回类型可能是实现FromStr的任何类型的Option,例如intu8IpAddr。如果您没有明确说明A是什么,通过将from_str(…)更改为from_str::<int>(…)或类似内容,编译器将尝试找出它可能是什么。在这种情况下,它会向前看,x类型为A,并且根据x的使用情况,它也必须实现std::fmt::Show。没有其他任何东西可以推断。

那么,什么类型实现FromStrShow?它们中有很多,只要不止一个,编译器就不可能决定你的意思,所以它放弃了。

解决方案是通过编写from_str::<int>(num.as_slice())或类似内容来规定您希望解析该论点的类型。

答案 1 :(得分:2)

from_str的返回类型是通用的。它可以返回任何实现FromStr的类型,包含在Option中。编译器无法根据值的用法推断出您想要的类型,因为println!也是通用的。它是i32f64bool还是其他什么?

您可以在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"),
    }
}