2015-05-24 61 views
4

我想實現一個使用錯誤參數之一的錯誤描述,但我找不到一種方法來返回不會消失的描述。使用自己的字符串實現錯誤描述

#[derive(Debug, PartialEq)] 
pub struct MissingParamError { 
    name: Box<String> 
} 

impl Error for MissingParamError { 
    fn description(&self) -> &str { 
     &format!("Missing parameter {}", self.name) 
    } 
} 

這當然會由於生成的描述超出範圍而導致錯誤。

對此有什麼解決辦法除了:

  • 加入MissingParamError::new這將預渲染完整描述
  • 添加Option<String>這將使得對需求的描述,並保持周圍

回答

8

不;方法簽名根本不允許你動態地構造字符串。此外,因爲它使用&self不可變指針),所以無法使用第二種解決方法。

由於實現Error必須所有類型也實施Display(其整個目的是用於顯示的值格式化到用戶),該將是合適的地方,以產生一個非平凡消息。

或者如您所建議的,如果您感覺很懶,請在MissingParamError::new中進行。


其實,你可以使用第二解決方法,如果你爲了得到內部可變性切換到RefCell<Option<String>>,但是這是一個有點矯枉過正。

實際上,你不能,因爲你不能從RefCell(謝謝,@bluss)獲得長期借款。

+4

我們應該補充一下,這是故意的:描述是爲了一個*便宜的*錯誤描述,使用'Display'特性來分配/格式化錯誤文本。 (你無法從RefCell那裏得到長期的借款) – bluss

+2

在'new'中急切地構建一個字符串很難*懶惰* ... –

+1

@ChrisMorgan:這是*非常*懶惰,畢竟,要做到這一點懶惰會需要更努力。 (看不到最後一個字符,不知道你要做什麼) –