2014-12-05 29 views
1

我只是想将输入的字符串转换为整数。我知道这可以通过将unwrap应用到from_str来完成,但我想我会尝试正确处理错误情况并改为使用匹配提取值。相反,它按预期工作我刚刚得到这个错误...从匹配的选项提取值给出“无法推断出足够的类型信息...”错误

error: unable to infer enough type information about _ ; type annotations required which points to the x in Some(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"), 
    } 
} 

我缺少什么?

回答

4

让我们来看看the definition of from_str

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

返回类型,你看到的,可以是任何类型的Option这实现FromStr,例如int,u8IpAddr。如果您没有明确说明A是什么,通过将from_str(…)更改为from_str::<int>(…)或类似的内容,编译器会尝试弄清楚它可能是什么。在这种情况下,它会向前看,看到x类型为A,并基于x的使用情况,它也必须实现std::fmt::Show。没有别的可以推断的。

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

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

+0

谢谢您的详细解释! – AllTheTime 2014-12-05 06:50:00

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"), 
    } 
} 
相关问题