【发布时间】:2015-01-25 21:24:45
【问题描述】:
我正在尝试编写一个从给定字符串解析浮点数的函数。它应该在错误或负值的情况下返回错误。
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 中注释表达式类型?
例如在 Haskell 中,我可以写如下内容:
if (value :: f32) > 0.0 ...
或者在模式匹配中加入类型注解::
Some(value :: f32) => ...
【问题讨论】:
-
我当然希望类型推断能够将返回类型(具有
f32)与表达式Ok(value)的类型统一起来,并推断出value : f32。您能否通过在from_str调用中添加类型提示来确保这确实是问题所在? IE。<f32 as FromStr>::from_str(strvalue)? 编辑:是的,这为我解决了问题。仍然不知道为什么,或者这是否是最好的解决方案,所以我不会发布答案。 -
@delnan 我认为当问题实际上是多个问题时发布“部分”答案是可以的。
-
这一定是个错误。如果我将原始代码更改为
if 0.0 <= value,它将编译。我已经提交了21634 -
作为记录,
FromStr::from_str已更改为返回Result<_, _>而不是Option<_>。所以如果你在 Rust master 上尝试,请记住这一点。 -
并且修复程序 (21817) 正在向主人发送:D
标签: rust inferred-type