如何解决"temporary value dropped while borrowed"



我正在学习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
};

我该如何解决这个问题?我需要重写函数检查两个向量之间差异的方式吗(itertools有一个zip_lengest方法,我也使用它(。

为了返回对临时对象的引用,您需要使临时对象的使用寿命比该引用的使用寿命更长。

在代码中,匹配分支一结束,临时对象就会被丢弃,因此对它的引用无法转义匹配。

Rust中有一个很好的技巧可以延长临时用户的使用寿命。它包括在您希望它所在的较大块中声明临时名称+,而不初始化它。然后您将initialize分配给实际创建临时对象的位置。类似这样的东西:

let tmp_new;
let new_children = match new_view.unwrap() {
View::View(children) => children,
View::Render(ref component) => {
tmp_new = component.render();
&tmp_new }
};

现在new_children是类型&Vec<_>,并且它将在match分支的两个寿命中较短的一个寿命内生存。

注意,除非您在match的每个分支中初始化临时,否则您不能在它之后使用tmp_new,因为您将获得:

使用可能未初始化的变量:tmp_new

相关内容

最新更新