我有一个带有字段的结构,其中包含对其他结构的引用(我没有定义)
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);
}
}
但我有点卡住,因为:
self
&self
修改为&mut self
,因为这会导致其他问题...... 也许我这样做完全错了..我还能做些什么吗?我有什么选择?
如果您需要更完整的代码概述,可以找到它here
PS:我不知道如何描述标题中的情况,随时可以更改
答案 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
的回调列表。