gpt4 book ai didi

rust - 根据最后一个元素将某物插入向量中

转载 作者:行者123 更新时间:2023-11-29 07:47:54 25 4
gpt4 key购买 nike

我想获取向量的最后一个元素并使用它来确定要插入的下一个元素。这是一个它如何不起作用的示例,但它显示了我正在努力实现的目标:

let mut vector: Vec<i32> = Vec::new();

if let Some(last_value) = vector.last() {
vector.push(*last_value + 1);
}

我不能使用 push 而 vector 也被不变地借用了:

error[E0502]: cannot borrow `vector` as mutable because it is also borrowed as immutable
--> src/main.rs:5:9
|
4 | if let Some(last_value) = vector.last() {
| ------ immutable borrow occurs here
5 | vector.push(*last_value + 1);
| ^^^^^^ mutable borrow occurs here
6 | }
| - immutable borrow ends here

执行此操作的好方法是什么?

最佳答案

非词法生命周期之后

您的原始代码 works as-is in Rust 2018 , 这使得 non-lexical-lifetimes :

fn main() {
let mut vector: Vec<i32> = Vec::new();

if let Some(last_value) = vector.last() {
vector.push(*last_value + 1);
}
}

借用检查器已得到改进以实现 last_value 中的引用不与 vector 的可变借用重叠需要插入一个新的值(value)。

参见 Returning a reference from a HashMap or Vec causes a borrow to last beyond the scope it's in?对于类似的情况,借用检查器还不够聪明,无法处理(从 Rust 1.32 开始)。

在非词法生命周期之前

vector.last() 的结果是一个 Option<&i32> .该值中的引用保留了借用的向量。在推送到 vector 之前,我们需要删除对 vector 的所有引用。

如果您的向量包含 Copy能够值,将值复制出向量以更快地结束借用。

fn main() {
let mut vector: Vec<i32> = Vec::new();

if let Some(&last_value) = vector.last() {
vector.push(last_value + 1);
}
}

在这里,我使用了模式 Some(&last_value)而不是 Some(last_value) .这解构 引用并强制复制。如果您使用不是 Copy 的类型尝试此模式能够,你会得到一个编译器错误:

error[E0507]: cannot move out of borrowed content
--> src/main.rs:4:17
|
4 | if let Some(&last_value) = vector.last() {
| ^----------
| ||
| |hint: to prevent move, use `ref last_value` or `ref mut last_value`
| cannot move out of borrowed content

如果你的向量不包含Copy能的类型,你可能想先克隆值:

fn main() {
let mut vector: Vec<String> = Vec::new();

if let Some(last_value) = vector.last().cloned() {
vector.push(last_value + "abc");
}
}

或者您可以用另一种方式转换值,例如 .map()调用返回一个不从向量借用的值。

fn main() {
let mut vector: Vec<String> = Vec::new();

if let Some(last_value) = vector.last().map(|v| v.len().to_string()) {
vector.push(last_value);
}
}

关于rust - 根据最后一个元素将某物插入向量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33359426/

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