0

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

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 引用,因为该结构没有实现复制
  • 我无法修改&self为,&mut self因为这会导致其他问题...

也许我做错了。我还能做些什么吗?我有哪些选择?

如果您需要更完整的代码概览,可以在此处找到

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

4

1 回答 1

0

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

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

另请参阅:关于迭代向量的 Rust 编程语言

但是有一个问题:Handlebars 需要助手的所有权。很有可能您Handlebars每次渲染时都必须创建一个新对象,但在这种情况下,您还需要能够在每次创建新的Handlebars. 如果不至少&mut引用Vec. 您至少需要可变访问权限才能将处理程序从结构中取出。如果你这样做了,你就不会在下一次render()调用处理程序了。根据处理程序集的可配置性,您可以拥有一个Vec<Box<HelperDef + 'static>>在需要时凭空构建的函数,或者您可以维护一个Box<HelperDef + 'static>为您构建的回调列表。

于 2015-08-16T19:49:53.493 回答