【发布时间】:2016-01-16 14:38:38
【问题描述】:
问题
我正在尝试在枚举上实现 std::error::Error 特征。枚举的一些元素是枚举变体,我想生成一条不同的错误消息,其中包含来自变体的数据。但是,在格式化的String 下面的实现中,Deref 到 &str 的寿命不够长。
一般的解决方案是返回一个String。但是,这不是一个选项,因为返回的类型必须是 &str,由 Error 特征指定。
示例:Playground link
请务必注意,变体可能不包含 usize,而可能是另一个枚举或结构等。
use std::fmt;
use std::fmt::{Display, Formatter};
use std::error;
#[derive(Debug)]
enum EnumError {
A,
B(usize),
C(usize),
D,
}
impl error::Error for EnumError {
fn description(&self) -> &str {
use EnumError::*;
match *self {
A => "A happened",
B(value) => &*format!("B happened info: {:?}", value),
C(value) => &*format!("B happened info: {:?}", value),
D => "D happened",
}
}
}
impl Display for EnumError {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
use std::error::Error;
write!(f, "{}", self.description())
}
}
fn main() {}
【问题讨论】:
-
不是重复的。引用问题中的答案建议返回一个拥有的字符串 - 这不是一个选项,因为返回类型是由特征指定的。当问题突然关闭时,我正在写这个问题的答案,这非常令人沮丧。我编辑了问题以明确这一点。
-
@Malcolm 根本无法返回在函数内创建的内容的字符串切片。我没有投票赞成关闭,但除了将预先格式化的错误字符串存储在枚举本身中之外,我在这里看不到任何解决方案,这非常笨拙。
-
@VladimirMatveev 您命名了这两个选项,这正是我要回答的内容。那会很有帮助。直接回答一个问题,该问题的答案暗示无法完成的事情根本没有帮助。
-
@Malcolm - 看起来你如愿以偿