【问题标题】:Is it possible to store an error cause in a struct without an enum?是否可以在没有枚举的结构中存储错误原因?
【发布时间】:2015-02-08 11:25:25
【问题描述】:

我正在用 Rust 编写一个库,并且希望 API 只公开我自己的错误类型,以及由内部使用的库导致的任何错误都包含在该类型中。我想实现 Error 特征并将原始错误公开为“原因”。我可以通过执行以下操作来使用枚举:

enum MyErrorCause {
    Zip(ZipError),
    Io(IoError),
    None
}

pub struct MyError {
    cause: MyErrorCause
}

impl Error for MyError {
    fn description(&self) -> &str { "an error" }

    fn cause(&self) -> Option<&Error> {
        match self.cause {
            MyErrorCause::Zip(ref err) => Some(err as &Error),
            MyErrorCause::Io(ref err) => Some(err as &Error),
            MyErrorCause::None => None
        }
    }
}

问题是我必须为每种原因类型添加一个枚举变体和几乎相同的匹配臂,而我只是将它们作为通用 Error 引用公开给用户。是否可以将原因作为Error 存储在MyError 结构中?我仍然希望事业归MyError所有。

【问题讨论】:

    标签: rust


    【解决方案1】:

    如果您不介意为每个错误分配内存的开销,您可以存储 Option&lt;Box&lt;Error + 'static&gt;&gt; 作为原因。创建MyError 时,只需使用Some(Box::new(the_cause) as Box&lt;Error&gt;'static 绑定是为了让编译器知道您存储的任何错误都不能在其中包含短期引用。

    另一种选择是编写一个扩展为所需的enumimpl 的宏,但这似乎有点矫枉过正。

    【讨论】:

    • 关于引用的“短命”是什么意思?我在其他地方看到过使用Box 和静态生命周期的东西,但我认为这意味着该值必须是编译时的常量/已知。
    • @David: 'static 作为类型的约束意味着该类型在生命周期内不包含任何小于'static 的引用。所以i32String 很好,因为它们拥有自己的数据并且不包含引用,而&amp;'static str 很好,因为虽然它有引用但它是静态的。
    猜你喜欢
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2015-10-13
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多