& self move field包含Box - 移出借来的内容

时间:2015-08-16 19:43:48

标签: rust borrow-checker

我有一个带有字段的结构,其中包含对其他结构的引用(我没有定义)

struct HtmlHandlebars {
    user_helpers: Vec<(String, Box<HelperDef + 'static>)>,
}

HtmlHandlebars必须实现一个功能

fn render(&self, ...) -> &self

在该函数中,我需要将Box移动到另一个函数。像这样:

fn render(&self, ...) -> &self {
    let mut handlebars = Handlebars::new();
    for (name, helper) in self.user_helpers {
        handlebars.register_helper(&name, helper);
    }
}

但我有点卡住,因为:

  • 我无法移动Box引用,因为我正在借用self
  • 我无法复制Box引用,因为该结构不实现copy
  • 我无法将&self修改为&mut self,因为这会导致其他问题......

也许我这样做完全错了..我还能做些什么吗?我有什么选择?

如果您需要更完整的代码概述,可以找到它here

PS:我不知道如何描述标题中的情况,随时可以更改

1 个答案:

答案 0 :(得分:0)

您编写的代码正在尝试使用Vec及其元素。通常,您可以迭代&self.user_helpers,这将为您提供对元素的引用,而不是消耗它们。那就是(模式中模数愚蠢的拼写错误):

for &(ref name, ref helper) in self.user_helpers {
    handlebars.register_helper(name, helper);
}

另请参阅:The Rust Programming Language on iterating vectors

虽然存在问题:把手需要帮助者的所有权。很可能每次渲染时都必须创建一个新的Handlebars对象,但在这种情况下,您还需要在每次创建新Handlebars时创建所有帮助程序。如果没有至少&mut Vec render()的引用,则无法获取框的所有权。您至少需要可变访问才能将处理程序从结构中取出。如果你这样做了,那么下次调用Vec<Box<HelperDef + 'static>>时就不会有处理程序。根据处理程序集的可配置程度,您可以拥有一个在需要时凭空构建Box<HelperDef + 'static>的函数,或者您可以维护一个为您构造forever start /path/to/mongod的回调列表。