我正在学习 Rust(来自 Javascript),并且在 Rust 中我尝试创建一个基于组件的 UI 模板。这是我可以在 Rust 游乐场中重现的最小示例。
我有一个枚举向量。我想添加将返回一组新向量的组件。该组件从不是引用的成员函数返回一个向量。
let _new_children = match new_view.unwrap() {
View::View(children) => children, // reference &Vec<View>
View::Render(ref component) => component.render(), // struct Vec<View>
};
let _new_children = match new_view.unwrap() {
View::View(children) => children,
View::Render(ref component) => &component.render(), // temporary value dropped while borrowed
};
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?我是否需要重写函数检查两个向量之间差异的方式(itertools有一个 zip_longest 方法,我也使用该方法)。
为了返回对临时对象的引用,您需要使临时对象的寿命比该引用的使用时间更长。
在您的代码中,一旦匹配分支结束,临时对象就会被删除,因此对它的引用无法逃脱匹配。
Rust 有一个很好的技巧来延长临时变量的生命周期。它包括在您希望其所在的较大块中声明临时名称+,而不对其进行初始化。然后在实际创建临时对象的地方对其进行分配初始化。像这样的东西:
let tmp_new;
let new_children = match new_view.unwrap() {
View::View(children) => children,
View::Render(ref component) => {
tmp_new = component.render();
&tmp_new }
};
Run Code Online (Sandbox Code Playgroud)
Nownew_children是类型&Vec<_>,它将存活于分支的两个生命周期中较短的一个match。
请注意,除非您在每个分支中初始化临时文件,否则match您无法在它之后使用tmp_new它,因为您将得到:
使用可能未初始化的变量:
tmp_new
| 归档时间: |
|
| 查看次数: |
2762 次 |
| 最近记录: |