rust - 解析整数或使用 unwrap_or 提供默认值,但使用默认值时打印错误消息

标签 rust

我已经编写了一些解析配置文件的代码。如果配置文件包含它在 Config 结构中设置的字段的有效值。如果未找到设置的有效整数值,它会设置一个默认值(例如:90)。

let config = Config {
    interval: settings.get("interval").unwrap().parse().unwrap_or(90),
}

我怎样才能让它闭包,以便它可以通过 error! 打印并设置默认值?

看起来像下面这样:

let config = Config {
    interval: settings.get("interval").unwrap().parse().unwrap_or({
        error!("No interval found. Using default: 90");
        90
    });
}

但是在这个例子中,error! 总是被执行,即使从配置中读取了一个有效的 interval 值。

parse() 失败时,如何才能使 unwrap_or 只执行 optb 中的代码?

最佳答案

How can I make it so that unwrap_or only executes the code in optb when parse() has failed?

  • 传递给 unwrap_or 的参数急切求值

  • 如果你传递的是函数调用的结果,建议 使用unwrap_or_else,这是惰性求值

在您的场景中,它应该更改如下:

let config: Config = Config {
   interval: settings.get("interval").unwrap().parse().unwrap_or_else(|_| {
        error!("No interval found. Using default: 90");
        90
    }),
}

Playground


此外,您不应在生产代码中使用裸 unwrap()。 错误处理是更好的解决方案,而不是使用裸体 unwrap()

Here您可以找到有关为什么不应该使用 unwrap()

的详细信息

关于rust - 解析整数或使用 unwrap_or 提供默认值,但使用默认值时打印错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54663849/

相关文章:

rust - 一个数组如何包含对同一对象的多个可变引用?

rust - 我如何真正禁用所有 rustc 优化?

rust - 打印!循环外是一个无法访问的语句,如何以 "reachable"方式使用 println

vector - 为什么 &[T] 参数也接受 &Vec<T>?

immutability - 如何强制结构的字段在 Rust 中始终是不可变的?

rust - 在哪里可以找到我项目的 Rust 测试二进制文件?

rust - 取消引用从 Rust 传递给 C 的类型定义指针时的段错误

rust - 在实现 actix 中间件时,我应该如何理解复杂的 where 子句?

Rust 0.9——读取文件?

testing - 如何在测试中模拟外部依赖项?