代码之家  ›  专栏  ›  技术社区  ›  Earth Engine

这种“静态”的生活从何而来

  •  -2
  • Earth Engine  · 技术社区  · 6 年前

    The following program 不编译:

    use std::any::Any;
    
    trait Foo<'a> {
        fn to_box_any(self: Box<Self>) -> Box<Any + 'a>;
    }
    
    fn test<'a>(v: Box<dyn Foo<'a> + 'a>) {
        v.to_box_any();
    }
    
    fn main() {}
    

    错误消息:

    error[E0478]: lifetime bound not satisfied
     --> src/main.rs:8:7
      |
    8 |     v.to_box_any();
      |       ^^^^^^^^^^
      |
    note: lifetime parameter instantiated with the lifetime 'a as defined on the function body at 7:1
     --> src/main.rs:7:1
      |
    7 | fn test<'a>(v: Box<dyn Foo<'a> + 'a>) {
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      = note: but lifetime parameter must outlive the static lifetime
    

    我想我已经尽可能多的标记了明确的生命时间,但是我不知道 static 寿命要求来自。

    如果我改变 Any 它有一个定制的特性,所以看起来像 任何 正在创建需求?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Shepmaster Tim Diekmann    6 年前

    我强烈建议您阅读您试图使用的代码的文档。例如,用于 Any 说(强调我的)

    模拟动态类型的类型。

    大多数类型实现 任何 . 然而, 任何包含非- 'static 参考 没有。见 module-level documentation 更多细节。

    这个特性本身需要 '静态 绑定:

    pub trait Any: 'static {
        fn get_type_id(&self) -> TypeId;
    }
    

    您还可以看到所有方法实现都需要 '静态 :

    impl Any + 'static {}
    impl Any + 'static + Send {}
    impl Any + 'static + Sync + Send {}