Vec <t>来自特质和T寿命的参考

时间:2017-06-01 12:38:21

标签: rust

我想立刻与多个Vec合作。这些向量可以专门用于不同类型。我创造了一个特质:

trait Column {
    //fn insert
    //fn remove
}

impl<T> Column for Vec<T> // ...

我可以将Vec<T1>Vec<T2>转换为Box<Column>,但我还需要将Box<Column>转换回Vec。正如How to get a struct reference from a boxed trait?中所建议的,我写道:

use std::any::Any;

trait Column {
    fn as_any(&self) -> &Any;
}

impl<T> Column for Vec<T>
    where T: Default
{
    fn as_any(&self) -> &Any {
        self //ERROR!
    }
}

但此代码会生成错误:

error[E0310]: the parameter type `T` may not live long enough
  --> src/main.rs:11:9
   |
11 |         self //ERROR!
   |         ^^^^
   |
   = help: consider adding an explicit lifetime bound `T: 'static`...
note: ...so that the type `std::vec::Vec<T>` will meet its required lifetime bounds
  --> src/main.rs:11:9
   |
11 |         self //ERROR!
   |         ^^^^

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

最简单的方法是将'static约束添加到T,即

impl<T> Column for Vec<T>
    where T: Default + 'static
{
    fn as_any(&self) -> &Any {
        self
    }
}

这意味着如果T有任何生命周期参数,则必须为'static。如果你想让它适用于具有生命周期参数的类型,那就有点复杂了。 (我不确定这是怎么回事。)

顺便说一句,Rust编译器有时会提供这样的建议,因此阅读错误消息非常有用。您也可以运行rustc --explain E0310(或任何错误代码),也许解释就足以找出解决方案。