gpt4 book ai didi

rust - 如何解决 “temporary value dropped while borrowed”

转载 作者:行者123 更新时间:2023-12-03 11:42:01 26 4
gpt4 key购买 nike

我正在学习Rust(来自Javascript),并在Rust中尝试创建基于组件的UI模板。 This is the minimum example我可以在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方法,我也使用过)。

最佳答案

为了返回对临时目录的引用,您需要使临时目录的生存期比使用该引用的生命周期更长。

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

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,因为您将获得:

use of possibly-uninitialized variable: tmp_new

关于rust - 如何解决 “temporary value dropped while borrowed”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60696720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com