我正在尝试编写一个从给定字符串解析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) => ...
答案 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) })
}