Concurrency &引用;错误:下划线生存期不稳定;从<;标准::同步::中毒错误>;

Concurrency &引用;错误:下划线生存期不稳定;从<;标准::同步::中毒错误>;,concurrency,rust,Concurrency,Rust,我正在处理一个如下所示的函数: fn do_stuff(&mut self, a: MyStruct) -> Result<(), MyError> { let x = try!(serde_json::to_vec(a)); let cache = Arc::clone(self.data); // Get shared reference { let cache = try!(cache.lock()); // Get lo

我正在处理一个如下所示的函数:

fn do_stuff(&mut self, a: MyStruct) -> Result<(), MyError> {
    let x = try!(serde_json::to_vec(a));

    let cache = Arc::clone(self.data); // Get shared reference
    {
        let cache = try!(cache.lock()); // Get lock
        cache.push(x);
    }

    /* Do stuff with other resources */

    Ok(())
}
在我开始为
MyError
实现
From
之前,编译器已经告诉我枚举的
Synch
变量的定义是错误的:

错误:下划线生存期不稳定(请参阅问题#44524)
使用下划线生存期的声明实际上来自编译器的一个早期提示,当时我正试图找出当
lock
操作失败时应该转换的错误。我读了上面提到的问题,这对我没有帮助

为了捕获来自
Mutex::lock
操作的错误,我应该从哪个完整类型转换

#[derive(Debug)]
pub enum MyError<'a> {
    Serialization(serde_json::Error),
    Synch(PoisonError<MutexGuard<'a, Vec<u8>>>),
}
#[派生(调试)]
发布枚举MyError>),
}
我在书中能找到的最贴切的解释是(
enum
s的行为方式相同)部分


编译器建议使用不稳定的语法作为解决方案是很不公平的。

谢谢你,这么简单的答案我忽略了,因为我想到了更复杂的东西。尽管如此,还是发生了一些有趣的事情。用@Dash83注释我的错误:一旦你引入了借用,那么,是的,你需要注释生命周期。这不一定是设计陷阱,只是您必须接受的东西,或者将设计更改为不使用借用(假设这是可能的)。虽然这是有意义的(我在代码的其他部分使用生命周期),但这使我在整个代码库中传播了新的生命周期,即使这种误差变化只发生在仅在某些情况下使用的单个函数中。这就是我发现这一切非常奇怪的地方。老实说,我可能根本不会传播
错误。您可能有一个
Synch
变体,但没有有效负载。你需要问问自己,你是否真的对
有毒错误做了任何值得做的事情
@Shepmaster:我知道,但这并没有改变它现在暗示的语法不稳定。用户不必意识到这一点:P
#[derive(Debug)]
pub enum MyError<'a> {
    Serialization(serde_json::Error),
    Synch(PoisonError<MutexGuard<'a, Vec<u8>>>),
}