gpt4 book ai didi

rust - 所有权 : differences between tuples and arrays in Rust

转载 作者:行者123 更新时间:2023-12-03 11:23:45 29 4
gpt4 key购买 nike

我开始学习 Rust,在进行实验时,我发现所有权如何应用于我不理解的元组和数组的方式有所不同。基本上,以下代码显示了差异:

#![allow(unused_variables)]

struct Inner {
in_a: u8,
in_b: u8
}
struct Outer1 {
a: [Inner; 2]
}

struct Outer2 {
a: (Inner, Inner)
}

fn test_ownership(num: &mut u8, inner: &Inner) {
}

fn main() {
let mut out1 = Outer1 {
a: [Inner {in_a: 1, in_b: 2}, Inner {in_a: 3, in_b: 4}]
};
let mut out2 = Outer2 {
a: (Inner {in_a: 1, in_b: 2}, Inner {in_a: 3, in_b: 4})
};

// This fails to compile
test_ownership(&mut out1.a[0].in_a, &out1.a[1]);
// But this works!
test_ownership(&mut out2.a.0.in_a, &out2.a.1);
}
test_ownership()的第一次调用不编译,正如预期的那样 Rust 会发出错误,提示同时对 out1.a[_] 进行可变和不可变引用.
error[E0502]: cannot borrow `out1.a[_]` as immutable because it is also borrowed as mutable
--> src/main.rs:27:41
|
27 | test_ownership(&mut out1.a[0].in_a, &out1.a[1]);
| -------------- ------------------- ^^^^^^^^^^ immutable borrow occurs here
| | |
| | mutable borrow occurs here
| mutable borrow later used by call
但我不明白的是,为什么第二次调用 test_ownership()不会让借阅检查员发疯吗?似乎数组被视为一个独立于被访问索引的整体,但元组允许对其不同索引的多个可变引用。

最佳答案

元组就像匿名结构,访问元组中的元素就像访问 结构域 .
结构可以部分借用(也可以部分移动),所以 &mut out2.a.0.in_a只借用元组的第一个字段。
这同样不适用于索引。索引运算符可以通过实现 Index 重载和 IndexMut ,所以 &mut out1.a[0].in_a相当于 &mut out1.a.index_mut(0).in_a .虽然 a.0只访问一个字段,a[0]调用函数!函数不能部分借用某些东西,因此索引运算符必须借用整个数组。

关于rust - 所有权 : differences between tuples and arrays in Rust,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62491845/

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