2015-09-05 33 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)] 
相關問題