首页 > 解决方案 > 如何解决“借来临时价值下降”

问题描述

我正在学习 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_longest 方法,我也使用它)。

标签: rustcomponents

解决方案


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

在您的代码中,一旦匹配分支结束,临时对象就会被删除,因此对它的引用无法逃脱匹配。

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 }
    };

现在new_children是类型,它将在分支&Vec<_>的两个生命周期中较短的一个。match

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

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


推荐阅读