在将字符串解析为数字时,可以推断类型并使用类型注释

时间:2015-01-25 21:24:46

标签: rust inferred-type

我正在尝试编写一个从给定字符串解析float的函数。如果错误或负值,它应该返回错误。

fn read_value(strvalue: &str) -> Result<f32, Error> {
    match FromStr::from_str(strvalue) {
        None => Err(Error::InvalidValue),
        Some(value) => if value >= 0.0 {Ok(value)} else {Err(Error::InvalidValue)}
    }
}

此代码给出:

src/main.rs:50:27: 50:32 error: the type of this value must be known in this context
src/main.rs:50         Some(value) => if value >= 0.0 {Ok(value)} else {Err(Error::InvalidValue)}

第一点。这个错误对我来说似乎很奇怪,因为如果我理解正确,可以自动推断出value的类型。从结果类型中,value的类型必须为f32

第二个问题。我该如何解决这个错误?或者更一般 - 如何在Rust中注释表达式的类型?

E.g。在Haskell中,我可以写出类似的东西:

if (value :: f32) > 0.0 ...

或者在模式匹配::

中放置类型注释
Some(value :: f32) => ...

1 个答案:

答案 0 :(得分:3)

要解决此问题,我建议使用带有类型参数的parse方法。要指定函数类型参数,而不是调用foo(),请调用foo::<types>()

fn read_value(strvalue: &str) -> Result<f32, u8> {
    match strvalue.parse::<f32>() {
        None => Err(1),
        Some(value) => if value >= 0.0 {Ok(value)} else {Err(2)}
    }
}

另一种没有类型注释的形式(并暗示这可能是一个错误)。此版本使用匹配警卫

fn read_value(strvalue: &str) -> Result<f32, u8> {
    match FromStr::from_str(strvalue) {
        None => Err(1),
        Some(value) if value >= 0.0 => Ok(value),
        _ => Err(2),
    }
}

另一个使用链式方法,将其表示为一系列变换:

fn read_value_chain(strvalue: &str) -> Result<f32, u8> {
    strvalue.parse()
        .ok_or(1)
        .and_then(|v: f32| if v > 0.0 { Ok(v) } else { Err(2) })
}