我有一些结构的特征及其实现:
trait Named {
fn name(&self) -> String;
}
struct Americano;
impl Named for Americano {
fn name(&self) -> String { String::from("Caffè Americano") }
}
我也希望在其他结构中存储这样的结构:
struct Menu {
item: Box<Named>,
}
impl Menu {
pub fn new(item: Box<Named>) -> Self {
Menu { item: item }
}
}
当我在 main
函数中装箱一个结构时,这非常有效:
fn main() {
let s = Menu::new(Box::new(Americano));
}
我很好奇如何在 Menu
的函数中移动装箱并使用类似的东西:
fn main() {
let s = Menu::new(Americano);
}
我尝试将 new
实现为:
impl Menu {
pub fn new<T: Named>(b: T) -> Self {
Menu { item: Box::new(b) };
}
}
但是我收到了错误
error: the parameter type `T` may not live long enough [--explain E0310]
--> <anon>:19:23
|>
19 |> Menu { item : Box::new(b) };
|> ^^^^^^^^^^^
help: consider adding an explicit lifetime bound `T: 'static`...
note: ...so that the type `T` will meet its required lifetime bounds
最佳答案
在你的结构中:
struct Menu {
item: Box<Named>,
}
Box<Named>
有一个隐含的 lifetime bound相当于Box<Named + 'static>
.因此,为了满足这些要求,将值传递给 Menu::set
也必须是 'static
.
impl Menu {
pub fn set<T: Named + 'static>(b: T) -> Self {
Menu { item: Box::new(b) }
}
}
另一种选择是泛化您的结构以接受任何生命周期限制。
struct Menu<'a> {
item: Box<Named + 'a>
}
impl<'a> Menu<'a> {
pub fn new(item: Box<Named + 'a>) -> Self {
Menu { item: item }
}
pub fn set<T: Named + 'a>(b: T) -> Self {
Menu { item: Box::new(b) }
}
}
关于rust - 如何将装箱移动到函数而不是调用方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39675880/