以下Rust代码无法编译:

pub struct UserAction<'u> {
    _act: &'u mut (FnMut() + 'u)
}

impl<'u, F: FnMut() + 'u> From<F> for UserAction<'u> {
    fn from(f: F) -> Self {
        UserAction { _act: (&mut f) as &'u mut (FnMut() + 'u) }
    }
}

我从rustc 1.10 stable获得的错误是:
lives.rs:7:38: 7:39 error: `f` does not live long enough
lives.rs:7             UserAction { _act: (&mut f) as &'u mut (FnMut() + 'u) }
                                                ^
lives.rs:6:31: 8:10 note: reference must be valid for the lifetime 'u as defined on the block at 6:30...
lives.rs:6         fn from(f: F) -> Self {
                                         ^
lives.rs:6:31: 8:10 note: ...but borrowed value is only valid for the scope of function body at 6:30
lives.rs:6         fn from(f: F) -> Self {
                                         ^
error: aborting due to previous error

我不知道为什么这是错误的;类型F的生存时间至少与生存期'u一样长,因为它受到限制。我缺少什么,如何解决此错误?

最佳答案

作为mcarton says,您正在将闭包的所有权传递给该函数,然后尝试对其进行引用。高兴的是编译器发现了错误,并阻止您使用对某些范围外变量的引用,这会导致内存损坏。

限制F: FnMut() + 'u指出F必须是实现FnMut特性的类型,并且包含使用生命周期超过'u生命周期的引用。并不是说F本身必须超过该生存期。实际上,我们可以看到方法退出后f没有所有者,因此它的生存期到此为止-从而出错。

最有效的等效方法是使用装箱的特征对象而不是特征对象引用:

pub struct UserAction<'u> {
    _act: Box<FnMut() + 'u>,
}

impl<'u, F: FnMut() + 'u> From<F> for UserAction<'u> {
    fn from(f: F) -> Self {
        UserAction { _act: Box::new(f) }
    }
}

另一种选择是渗透泛型类型:
pub struct UserAction<F> {
    _act: F,
}

impl<F: FnMut()> From<F> for UserAction<F> {
    fn from(f: F) -> Self {
        UserAction { _act: f }
    }
}

关于compiler-errors - 尽管值(value)受到约束,但值(value)还不够长,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38339755/

10-11 10:36