2015-09-05 47 views
0

我试图学习Rust,但是当我为我的一个类型实现fmt::Display特征时,我面临着一个困难。我想要做这样的事情:传播错误的正确方法是什么?

fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 
    write!(f, "("); 
    some_helper_function(self.t1, self.ctx, f); 
    write!(f, " "); 
    some_helper_function(self.t2, self.ctx, f); 
    write!(f, ")") 
} 

所有这些函数返回fmt::Result,但这会被忽略。向上传播错误结果的正确方法是什么?

回答

3

对于每个函数调用,检查返回是否为Err对象。如果它是从函数返回的Err对象,如果不是,则继续。 标准库中有一个方便的宏,称为try!,它正是这样做的。

所以,你的代码会变得这样的事情:

fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 
    try!(write!(f, "(")); 
    try!(some_helper_function(self.t1, self.ctx, f)); 
    try!(write!(f, " ")); 
    try!(some_helper_function(self.t2, self.ctx, f)); 
    try!(write!(f, ")")) 
} 
+2

*的Err对象* - 迂腐,'Err'是'Result'枚举的变体*。 – Shepmaster

+0

'try!'是[不再推荐](https://rustbyexample.com/hello/print/print_display/testcase_list.html)的方式。使用'?'来代替:即'write!(f,“(”)?;' – tolitius

0

Andrea P's answer是当场对如何解决这一问题。我想添加到这一部分,虽然:

所有这些函数返回fmt::Result,但这会被忽略。

注意,编译器试图真的很难帮助你在这里:

fn important() -> Result<u8,()> { 
    Err(()) 
} 

fn main() { 
    important(); 
} 

会产生默认情况下此警告:

warning: unused result which must be used, #[warn(unused_must_use)] on by default 
    important(); 
    ^~~~~~~~~~~~ 

你甚至可以让这个所有警告变成错误加入给你的箱子:

#![deny(unused_must_use)]