以下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/