预期的具体生命周期,在结构中存储fn时找到绑定生命周期参数

时间:2016-12-11 14:30:17

标签: rust

我正在尝试将函数存储在结构中:

trait T<'a> {}

struct A {}

struct B<'a> {
    a: &'a A
}

impl<'a> T<'a> for B<'a> {}

fn f1<'a, E: T<'a>>(a: &'a A) {}

struct D {
    f: fn(&A)
}

fn main() {
    let d = D { f: f1::<B> };
}

编译器抱怨:

error[E0308]: mismatched types
  --> src/main.rs:18:20
   |
18 |     let d = D { f: f1::<B> };
   |                    ^^^^^^^ expected concrete lifetime, found bound lifetime parameter 
   |
   = note: expected type `fn(&A)`
   = note:    found type `fn(&A) {f1::<'_, B<'_>>}`

1 个答案:

答案 0 :(得分:3)

当您编写f1::<B>时,编译器会将其解释为f1::<B<'_>>'_是编译器推断的生命周期,因为B在一生中是通用的,而您只能将具体类型作为类型参数传递。

但是,在D中,f字段应该是一个接受A对任何生命周期的引用的函数。 f1::<B>不符合该要求,因为该函数已使用特定的生命周期进行实例化。

不幸的是,目前还没有办法让这项工作成功。 Rust必须支持higher kinded typesassociated type constructors。然后,您可以在E中将f1定义为类型构造函数参数,而不是类型参数(尽管我想知道编译器如何处理'a生命周期参数)。