如何将拳击移动到函数而不是调用方

时间:2016-09-24 11:35:55

标签: 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

1 个答案:

答案 0 :(得分:2)

在你的结构中:

<ul class="list-blog" style="list-style: none;">
   <div class="row">
     {% for article in blog.articles %}
    <div class="col-xs-4 main-col">
       <div class="content-blog">
 <li class="myownstyleclass" style=" border: 2px solid #D3D3D3; padding-left:15px;"> 
   <h3><a href="{{ article.url }}">{{ article.title }}</a></h3></li>

          </div>
         </div>
     {% endfor %}
        </div>
 </ul>

struct Menu { item: Box<Named>, } 具有隐式lifetime bound,相当于Box<Named>。因此,为了满足这些要求,传递给Box<Named + 'static>的值也必须为Menu::set

'static

另一种选择是概括你的结构以接受任何生命周期限制。

impl Menu {
    pub fn set<T: Named + 'static>(b: T) -> Self {
        Menu { item: Box::new(b) }
    }
}