我想立刻与多个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!
| ^^^^
如何解决此问题?
答案 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
(或任何错误代码),也许解释就足以找出解决方案。