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

spe*_*peg 2 pointers rust

傻n00b试图学习一点Rust.这是我的计划:

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

产生了输出:

[1, 2, 3]
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

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

我最初是由这在抛出介绍它看起来像他们被循环通过一个参考.我的猜测是Rust做了一些魔法并检测到它是向量的内存地址?

She*_*ter 6

&的重点是什么?

&正如你所推测的那样,它会引用一个对象.但是,有一个Debug实现对Debug类型的引用只打印出引用的对象.这样做是因为Rust倾向于更喜欢值相等而不是引用相等:

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

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

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

它看起来像是在循环引用

for i in foo语法糖调用into_iteratorfoo,并有一个实施IntoIterator&Vec返回到了迭代项目的引用的迭代器:

fn into_iter(self) -> slice::Iter<'a, T> {
    self.iter()
}
Run Code Online (Sandbox Code Playgroud)