元组的Rust引用与引用元组

ubbxdtey  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(103)

元组的引用和引用的元组作为类型之间的关系是什么?
为什么第一个有效,第二个无效?

let a = 1;
let b = 2;
// This works, c: &i32, d:&i32
let (c, d) = &(a, b);

type TupleOfRef<'a> = (&'a i32, &'a i32);
let e = (a, b);
// This doesn't
let f: TupleOfRef = &e;
ibrsph3r

ibrsph3r1#

简单的答案是&(i32, i32)(&i32, &i32)不是同一个类型,但这可能不是您想要的详细程度。
如果你从内存布局的Angular 来考虑,也许更容易理解为什么。cheats.rs有一些很好的插图,我将无耻地在这里窃取:

这里重要的是,无论你在tuple中存储什么,元素在内存中总是连续的。对于拥有的类型和引用来说是这样的,只是当元素是引用时,它指向的内存不一定是连续的。
这就是为什么&(T, U)(&T, &U)之间的转换是非常重要的。(意味着它们在存储器中物理地在一起),并且引用指向“束”。在后一种情况下,您拥有&T&U的“bundle”(这意味着引用在内存中物理上是在一起的,但它们可以各自指向它们想要的任何地方)。

ccrfmcuu

ccrfmcuu2#

虽然&(a, b)解构为两个都是&i32的变量,但这与具有(&i32, &i32)类型的元组是不同的。
可以使用let f: TupleOfRef = ( &e.0, &e.1 );使第二个示例正常工作

相关问题