【发布时间】:2018-01-15 09:01:45
【问题描述】:
我正在编写一个函数,该函数将在无限循环中调用,并且仅在从 Web 服务获取格式良好的数据时执行某些操作。如果服务宕机,返回非json,或者返回我们不理解的json,该函数应该只记录错误并返回(暂停后再次调用)。
我发现自己在复制和粘贴这样的内容:
let v = match v {
Ok(data) => data,
Err(error) => {
println!("Error decoding json: {:?}", error);
return;
}
};
错误匹配器的主体每次都会不同。有时它是恐慌,有时它有不同的消息,有时error 的元素可以进一步分解以形成更好的消息,但结构的其余部分将是相同的。
这个有简写吗?我知道? syntax,但那是为了传播。当您需要稍微不同的处理以防出现上述场景中的错误时,我认为传播不会对场景有所帮助。这是因为处理方面的特殊差异就在此处,而不是在堆栈中。
我还没有用 Rust 写过很多代码,所以很可能我遗漏了一些明显的东西。
在 C# 中,上面的内容如下所示:
if (v == null)
{
Console.WriteLine("Error decoding json!");
return;
}
或
if (error != null)
{
Console.WriteLine($"Error decoding json: {error}");
return;
}
这两者都比 Rust 简洁得多。
如果我理解下面的 cmets,一种缩短方法是这样的:
if let Err(error) = v {
println!("Error decoding json: {:?}", error);
return;
}
let v = v.unwrap();
这看起来更紧凑,谢谢。这是惯用语吗?你会这样写吗?
【问题讨论】:
-
如果您只对其中一个分支感兴趣,可以使用
if let。 Example -
@PaoloFalabella 是的,但是您需要单独打开结果。不过,谢谢你的提示。
-
@AndrewSavinykh 不,您可以在
if let中使用模式匹配。见doc.rust-lang.org/book/second-edition/ch06-03-if-let.html -
您可以编写自己版本的
try!宏。 playground
标签: rust