我试图将一个字段放在应该包含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始终具有与闭包本身相同的生存期,我认为这是一个错误的假设。

10-08 03:15