【问题标题】:Inferring types and using type annotations when parsing a string to a number将字符串解析为数字时推断类型和使用类型注释
【发布时间】: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。 &lt;f32 as FromStr&gt;::from_str(strvalue)? 编辑:是的,这为我解决了问题。仍然不知道为什么,或者这是否是最好的解决方案,所以我不会发布答案。
  • @delnan 我认为当问题实际上是多个问题时发布“部分”答案是可以的。
  • 这一定是个错误。如果我将原始代码更改为if 0.0 &lt;= value,它将编译。我已经提交了21634
  • 作为记录,FromStr::from_str 已更改为返回 Result&lt;_, _&gt; 而不是 Option&lt;_&gt;。所以如果你在 Rust master 上尝试,请记住这一点。
  • 并且修复程序 (21817) 正在向主人发送:D

标签: rust inferred-type


【解决方案1】:

要解决这个问题,我建议使用带有类型参数的parse 方法。要指定函数类型参数,请调用foo::&lt;types&gt;(),而不是调用foo()

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) })
}

【讨论】:

    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    相关资源
    最近更新 更多