元组的引用和引用的元组作为类型之间的关系是什么?为什么第一个有效,第二个无效?
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;
ibrsph3r1#
简单的答案是&(i32, i32)和(&i32, &i32)不是同一个类型,但这可能不是您想要的详细程度。如果你从内存布局的Angular 来考虑,也许更容易理解为什么。cheats.rs有一些很好的插图,我将无耻地在这里窃取:
&(i32, i32)
(&i32, &i32)
这里重要的是,无论你在tuple中存储什么,元素在内存中总是连续的。对于拥有的类型和引用来说是这样的,只是当元素是引用时,它指向的内存不一定是连续的。这就是为什么&(T, U)和(&T, &U)之间的转换是非常重要的。(意味着它们在存储器中物理地在一起),并且引用指向“束”。在后一种情况下,您拥有&T和&U的“bundle”(这意味着引用在内存中物理上是在一起的,但它们可以各自指向它们想要的任何地方)。
&(T, U)
(&T, &U)
&T
&U
ccrfmcuu2#
虽然&(a, b)解构为两个都是&i32的变量,但这与具有(&i32, &i32)类型的元组是不同的。可以使用let f: TupleOfRef = ( &e.0, &e.1 );使第二个示例正常工作
&(a, b)
&i32
let f: TupleOfRef = ( &e.0, &e.1 );
2条答案
按热度按时间ibrsph3r1#
简单的答案是
&(i32, i32)
和(&i32, &i32)
不是同一个类型,但这可能不是您想要的详细程度。如果你从内存布局的Angular 来考虑,也许更容易理解为什么。cheats.rs有一些很好的插图,我将无耻地在这里窃取:
这里重要的是,无论你在tuple中存储什么,元素在内存中总是连续的。对于拥有的类型和引用来说是这样的,只是当元素是引用时,它指向的内存不一定是连续的。
这就是为什么
&(T, U)
和(&T, &U)
之间的转换是非常重要的。(意味着它们在存储器中物理地在一起),并且引用指向“束”。在后一种情况下,您拥有&T
和&U
的“bundle”(这意味着引用在内存中物理上是在一起的,但它们可以各自指向它们想要的任何地方)。ccrfmcuu2#
虽然
&(a, b)
解构为两个都是&i32
的变量,但这与具有(&i32, &i32)
类型的元组是不同的。可以使用
let f: TupleOfRef = ( &e.0, &e.1 );
使第二个示例正常工作