使用自己的字符串实现错误描述

vir*_*tor 5 lifetime rust

我想实现一个使用错误参数之一的错误描述,但我找不到一种方法来返回一个不会消失的描述.

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

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

这当然会因生成的描述超出范围而导致错误.

除此之外,有没有解决方法:

  • 添加MissingParamError::new将预呈现完整描述
  • 添加一个Option<String>可以根据需要呈现描述并保持不变的内容

DK.*_*DK. 8

没有; 方法签名根本不允许您动态构造字符串.此外,因为它使用&self(不可变指针),您不能使用您的第二个解决方法.

由于实现所有类型Error必须执行Display(其整个目的是用于向用户显示格式化的值),将是适当的地方,以产生一个非平凡消息.

或者如你所说,如果你感到懒惰,那就去做吧MissingParamError::new.


实际上,如果你切换到内部可变性,你可以使用第二种解决方法RefCell<Option<String>>,但这有点矫枉过正.

实际上,实际上,你不能,因为你不能从一个长期借来的RefCell(感谢@bluss).

  • 我们应该补充一下,这是故意的:描述是针对*cheap*错误描述,对于已分配/格式化的错误文本使用`Display`特征.(你不能从RefCell获得长期借用) (4认同)
  • 急切地在`new`中构建一个字符串很难*懒惰*... (2认同)