如何解决“借用时价值暂时下降”

Vah*_*ahe 1 components rust

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

rod*_*igo 5

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

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

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