gpt4 book ai didi

vector - 如何将集合中的多个元素传递给一个或多个元素可变的函数?

转载 作者:行者123 更新时间:2023-11-29 07:50:13 30 4
gpt4 key购买 nike

当将来自同一向量的两个元素传递给一个函数时,借用检查器将不允许其中一个元素是可变的。

struct Point {
x: i32,
y: i32,
}
fn main() {
let mut vec: Vec<Point> = Vec::new();
foo(&mut vec[0], &vec[1]);
}
fn foo(pnt_1: &mut Point, pnt_2: &Point) {
}

error: cannot borrow vec as immutable because it is also borrowed as mutable

vec 永远不会被 foo 借用,但是 vec[0] 被借用并且 vec[0]是一个

如何将同一集合中的多个元素传递给一个函数,其中一个或多个元素是可变的?

最佳答案

How can I pass multiple elements from the same collection into a function with one or more of the elements being mutable?

简短的回答是你不能,至少不能没有集合本身的支持。

Rust 不允许可变别名 - 同一事物的多个名称,其中一个允许突变。

要验证 (&mut vec[0], &vec[1]) 不会引入别名但 (&mut vec[0], &vec[0]) 可以。更复杂的是 [] 运算符可以被重载,这允许创建一个类型 foo[0]foo[1] 实际上 指向同一事物

那么,集合如何提供帮助?每个集合都将具有(或不具有)以别名安全方式进行的特定分割方式。

可以有像slice::split_at_mut这样的方法它验证两半不能重叠,因此不会发生混叠。

不幸的是,据我所知,没有HashMap::get_two_things(&a, &b)。它会非常小众,但这并不意味着它不能存在。

vec is never borrowed by foo though

肯定是。当您索引一个 Vec 时,您将获得对 Vec 内的某个内存块的引用。如果 Vec 在您下面发生变化,例如当有人添加或删除一个值 时,则可能需要重新分配底层内存,从而使引用无效。这是为什么可变别名是一件坏事的主要例子。

关于vector - 如何将集合中的多个元素传递给一个或多个元素可变的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39778297/

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