繁体   English   中英

如何在Fn特征绑定返回的引用上定义生存期?

[英]How to define lifetimes on a Fn trait bound returning references?

我正在尝试创建一个具有F泛型字段的结构,其中F实现类似Fn(&mut Compiler, &[Token]) -> &Token 唯一的问题是,我不确定如何在Fn特征上定义生存期,该生存期是否满足以下条件:返回的&Token引用了作为参数提供的&[Token]切片中的数据。 到目前为止,我尝试过的所有操作都引发了错误。

这是一个MVCE,它演示了代码(没有任何生存期):

struct Compiler;
#[derive(Debug)]
struct Token(usize);

impl Compiler {
    // missing lifetime paramters here
    fn meth(&mut self, tokens: &[Token]) -> &Token {
        tokens.get(0).unwrap()
    }
}

// missing lifetime paramters here    
struct Rule<F> where F: Fn(&mut Compiler, &[Token]) -> &Token {
    func: F
}

fn main() {
    let mut c = Compiler;
    let tokens = vec![Token(0), Token(1), Token(2)];
    let r = Rule { func: Compiler::meth };
    (r.func)(&mut c, &tokens);
}

自然,这无法编译并显示以下错误:

   Compiling playground v0.0.1 (/playground)
error[E0106]: missing lifetime specifier
  --> src/main.rs:11:56
   |
11 | struct Rule<F> where F: Fn(&mut Compiler, &[Token]) -> &Token {
   |                                                        ^ expected lifetime parameter
   |
   = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from argument 1 or argument 2

我试图在这里和那里添加生命周期说明符,四处移动,但似乎无济于事。 我非常感谢您对此问题有任何见解。 谢谢!

根据@Stargateur的评论,解决方案是在Fn特性声明添加更高级别的特质界限 where for子句是完全针对此用例的一段语法。

正常的生存期边界不起作用,因为在调用时间之前,我们不知道将哪些生存期应用于函数的参数。

所以我们从这里开始:

struct Rule<F> where F: Fn(&mut Compiler, &[Token]) -> &Token {
    func: F
}

对此:

struct Rule<F> where for<'a> F: Fn(&mut Compiler, &'a[Token]) -> &'a Token {
    func: F
}

这表明应用于函数F的特征范围必须满足调用时 'a所有潜在寿命。 魔法!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM