rust - 如何将装箱移动到函数而不是调用方

标签 rust traits boxing

我有一些结构的特征及其实现:

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

这是 code in the playground .

最佳答案

在你的结构中:

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/

相关文章:

rust - 什么时候只需要 PartialEq 而不需要 Eq 是合适的?

closures - 将修改其环境的闭包传递给 Rust 中的函数

C#:将 float 表达式转换为 int 时结果错误

java - Java中的整数比较

python - 用 Python 编写的反向 shell 脚本的 Rust 等价物是什么?

rust - 如何在 Rust 串口 crate 中使用 readline 函数

函数指针与 Fn 特征对象

multithreading - Rust By Example 中的 channel 如何工作?

multithreading - 如何让一个线程从 HashMap 中删除而另一个线程插入?

vb.net - VB.NET“如果”运算符会导致装箱吗?