Rust双引号"&"的含义是什么?

6

我看到了一些代码,它长成这个样子:

fn test <'a> (&'a mut &'a str) {}

我知道 'a 是一个生命周期,& 是一个引用。

但是我不太理解双重引用 &&。

据我理解,引用就是指针,那么 && 是指向另一个指针的指针还是其他什么?


引用就是引用,如果一个引用是指针,我们本来会称其为指针而不是引用。所以“&&”是引用的引用。 - Stargateur
但是引用是指针的一种类型,对吗? - Willem van der Veen
是的,但在 Rust 中还有很多其他东西,比如 Box<T>Vec<T>,当然还有像 *mut T 这样的 原始指针。你使用的大多数指针都不仅仅是指针。 - trent
1
给未来的读者,这个问题是关于类型 &&T,不要与两次调用借用运算符(即 &&var)或布尔运算符(即 a && b)混淆。 - kmdreko
1个回答

6
在我的理解中,引用就是一个带有特殊借用检查语义的指针。指针,包括引用,在本质上都是内存中的地址(有时还有大小,但与此回答无关),这意味着它们本身就有一个值,与它们所 "指向" 或 "引用" 的值是分开的。这也就是为什么下面这段代码可以正常工作的原因:
fn main() {
    let num1 = 1;
    let num2 = 2;
    let mut num_ref = &num1;
    dbg!(num1, num2, num_ref); // num1 and num2 are 1 and 2 and num_ref is &1
    num_ref = &num2;
    dbg!(num1, num2, num_ref); // num1 and num2 are 1 and 2 and num_ref is &2
}

参考值不变,但是参考本身发生了变化。
因此,&mut &T 是一个可变引用指向一个不可变引用,这意味着您可以更改可变引用下面的引用。
fn make_reference_one(r: &mut &i32) {
    *r = &1;
}

fn main() {
    let mut num_ref = &2;
    dbg!(num_ref); // is &2
    make_reference_one(&mut num_ref);
    dbg!(num_ref); // is now &1
}

我认为应该是 参考文献下的值会改变,但参考文献本身不会改变。 就像地址指针所在的位置不会改变,但指针指向的值会改变。 @Willem @Aplet - yokus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接