对矢量的引用仍打印为矢量?

Reference to a vector still prints as a vector?

愚蠢的 n00b 试图学习一点 Rust。这是我的程序:

fn main() {
    let v = vec![1, 2, 3];
    println!("{:?}", v);
    println!("{:?}", &v);
}

产生了输出:

[1, 2, 3]
[1, 2, 3]

&有什么意义?我有一半期待它打印一个内存地址。

我最初是在 intro 中被这个问题抛出的,看起来他们正在循环 through 一个参考。我的猜测是 Rust 做了一些魔术并检测到它是一个向量的内存地址?

神奇的是格式化程序中的 AFAIK 而不是编译器。参见示例:

fn take_val<T>(a:Vec<T> ) {}
fn take_ref<T>(b:&Vec<T>) {}

fn main() {
    let v = vec![1, 2, 3];
    take_val(&v);
    take_ref(&v);

}

失败并出现以下错误:

<anon>:6:14: 6:16 error: mismatched types:
 expected `collections::vec::Vec<_>`,
    found `&collections::vec::Vec<_>`
(expected struct `collections::vec::Vec`,
    found &-ptr) [E0308]
<anon>:6     take_val(&v);

这表明这是由于格式化程序不想显示引用和值之间的差异。在旧版本的 Rust 中,如果我没记错的话,&v 会显示为 &[1, 2, 3]

& 在 Rust 中有特殊的含义。不仅仅是引用,它是一个注解,值被借给了一个或多个functions/methods。

What is the point of the &?

& 引用了一个对象,正如您猜测的那样。但是,有一个 Debug implementation for references to Debug types 只打印出所引用的对象。这样做是因为 Rust 更喜欢值相等而不是引用相等:

impl<'a, T: ?Sized + $tr> $tr for &'a T {
    fn fmt(&self, f: &mut Formatter) -> Result { $tr::fmt(&**self, f) }
}

如果你想打印内存地址,你可以使用{:p}:

let v = vec![1,2,3];
println!("{:p}", &v);

it looks like they are looping through a reference

for i in foo 语法糖在 foo 上调用 into_iterator,并且有一个 implementation of IntoIterator for &Vec,returns 是对迭代器中项的引用的迭代器:

fn into_iter(self) -> slice::Iter<'a, T> {
    self.iter()
}