我试图将一个字段放在应该包含Option<closure>
的结构上。
但是,Rust对我大吼大叫,我必须指定生命周期(不是我真的会对此感到困惑)。我正在尽力做到这一点,但是Rust对我的想法永远不满意。看一下我的内联注释,了解我得到的编译错误。
struct Floor{
handler: Option<|| ->&str> //this gives: missing lifetime specifier
//handler: Option<||: 'a> // this gives: use of undeclared lifetime name `'a`
}
impl Floor {
// I guess I need to specify life time here as well
// but I can't figure out for the life of me what's the correct syntax
fn get(&mut self, handler: || -> &str){
self.handler = Some(handler);
}
}
最佳答案
这有点棘手。
根据一般经验,每当您在数据结构中存储借用的引用(即&
类型)时,都需要命名其生存期。在这种情况下,使用'a
可以使您处在正确的轨道上,但是必须在当前范围中引入'a
。与引入类型变量的方式相同。因此,定义您的Floor
结构:
struct Floor<'a> {
handler: Option<|| -> &'a str>
}
但是这里还有另一个问题。闭包本身也是带有生存期的引用,也必须命名。因此,这里有两个不同的生命!试试这个:
struct Floor<'cl, 'a> {
handler: Option<||:'cl -> &'a str>
}
对于
impl Floor
,还需要将以下生存期引入范围:impl<'cl, 'a> Floor<'cl, 'a> {
fn get(&mut self, handler: ||:'cl -> &'a str){
self.handler = Some(handler);
}
}
从技术上讲,您可以将其缩短到一个生存期,并使用
||:'a -> &'a str
,但这意味着返回的&str
始终具有与闭包本身相同的生存期,我认为这是一个错误的假设。