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

Rob*_*wen 2 rust

我编写了一些解析配置文件的代码.如果配置文件包含它在Configstruct中设置的字段的有效值.如果未找到设置的有效整数值,则设置默认值(例如:90).

let config = Config {
    interval: settings.get("interval").unwrap().parse().unwrap_or(90),
}
Run Code Online (Sandbox Code Playgroud)

如何让它关闭,以便它可以打印error!并设置默认值?

看起来如下:

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

但在此示例中,error!即使从配置中读取了间隔中的有效值,也始终执行该操作.

我怎样才能使unwrap_or只在失败optb时执行代码parse()

Web*_*rix 6

您可以使用unwrap_or哪个进入闭包:

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

操场

在您的方案中,应更改如下:

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

此外,您不应该optb在生产代码中使用naked ,因为在发生错误时parse(),通常情况下您不应该这样做.

在这里,您可以找到有关您不应该使用的原因的详细信息unwrap_or

  • "unwrap()"的问题比"不要生产中的恐慌"更加微妙.链接问题的答案是一个很好的起点.我猜@Robin可能想要以与不可解析的值相同的方式处理缺少`"interval"字段,在这种情况下,一种方法是`.and_then(| value | value.parse( ).ok())`而不是`.unwrap().parse()`. (2认同)