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
};
我怎么解决这个问题?我是否需要重写函数检查两个向量之间差异的方式(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
在它之后使用它,因为您将获得:
使用可能未初始化的变量:
tmp_new
推荐阅读
- r - 绘制决策树分类器
- azure - Spark, wasb and Jetty 11
- spring-boot-gradle-plugin - no suitable constructor found for File(String)
- r - Filter columns based on the list of columns and list of values
- postgresql - .NET Library to Parse/Modify/Reconstruct SQL Statement
- javascript - Earth Engine 将特征属性添加到 ImageCollection
- python - Replace Acronyms with their values Python
- html - How do I stop the screen from jumping when clicking Accordion Menu?
- python - 无法使用 python-keycloak 包连接到 keycloak 管理员,出现错误 KeycloakGetError: 403: b''
- python - 如何让 setup.py 在子目录中包含一个包?